56 if (
count( $this->client->getServerList() ) ) {
57 $this->logger->debug( __METHOD__ .
": persistent Memcached object already loaded." );
64 if (
$params[
'use_binary_protocol'] ) {
65 $this->client->setOption( Memcached::OPT_BINARY_PROTOCOL,
true );
68 if ( isset(
$params[
'retry_timeout'] ) ) {
69 $this->client->setOption( Memcached::OPT_RETRY_TIMEOUT,
$params[
'retry_timeout'] );
72 if ( isset(
$params[
'server_failure_limit'] ) ) {
73 $this->client->setOption( Memcached::OPT_SERVER_FAILURE_LIMIT,
$params[
'server_failure_limit'] );
79 ini_set(
'memcached.compression_threshold',
$params[
'compress_threshold'] );
82 $this->client->setOption( Memcached::OPT_CONNECT_TIMEOUT,
$params[
'connect_timeout'] * 1000 );
83 $this->client->setOption( Memcached::OPT_SEND_TIMEOUT,
$params[
'timeout'] );
84 $this->client->setOption( Memcached::OPT_RECV_TIMEOUT,
$params[
'timeout'] );
85 $this->client->setOption( Memcached::OPT_POLL_TIMEOUT,
$params[
'timeout'] / 1000 );
93 $this->client->setOption( Memcached::OPT_LIBKETAMA_COMPATIBLE,
true );
96 switch (
$params[
'serializer'] ) {
98 $this->client->setOption( Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_PHP );
101 if ( !Memcached::HAVE_IGBINARY ) {
102 throw new InvalidArgumentException(
103 __CLASS__ .
': the igbinary extension is not available ' .
104 'but igbinary serialization was requested.'
107 $this->client->setOption( Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_IGBINARY );
110 throw new InvalidArgumentException(
111 __CLASS__ .
': invalid value for serializer parameter'
115 foreach (
$params[
'servers']
as $host ) {
116 if ( preg_match(
'/^\[(.+)\]:(\d+)$/', $host, $m ) ) {
117 $servers[] = [ $m[1], (int)$m[2] ];
118 } elseif ( preg_match(
'/^([^:]+):(\d+)$/', $host, $m ) ) {
119 $servers[] = [ $m[1], (int)$m[2] ];
121 $servers[] = [ $host,
false ];
124 $this->client->addServers( $servers );
130 if ( !isset(
$params[
'use_binary_protocol'] ) ) {
131 $params[
'use_binary_protocol'] =
false;
134 if ( !isset(
$params[
'serializer'] ) ) {
144 $flags = Memcached::GET_EXTENDED;
146 if ( is_array(
$res ) ) {
148 $casToken =
$res[
'cas'];
160 public function set( $key,
$value, $exptime = 0, $flags = 0 ) {
163 if (
$result ===
false && $this->client->getResultCode() === Memcached::RES_NOTSTORED ) {
170 protected function cas( $casToken, $key,
$value, $exptime = 0 ) {
172 return $this->
checkResult( $key, parent::cas( $casToken, $key,
$value, $exptime ) );
175 public function delete( $key ) {
177 $result = parent::delete( $key );
178 if (
$result ===
false && $this->client->getResultCode() === Memcached::RES_NOTFOUND ) {
217 switch ( $this->client->getResultCode() ) {
218 case Memcached::RES_SUCCESS:
220 case Memcached::RES_DATA_EXISTS:
221 case Memcached::RES_NOTSTORED:
222 case Memcached::RES_NOTFOUND:
223 $this->
debugLog(
"result: " . $this->client->getResultMessage() );
226 $msg = $this->client->getResultMessage();
228 if ( $key !==
false ) {
229 $server = $this->client->getServerByKey( $key );
230 $logCtx[
'memcached-server'] =
"{$server['host']}:{$server['port']}";
231 $logCtx[
'memcached-key'] = $key;
232 $msg =
"Memcached error for key \"{memcached-key}\" on server \"{memcached-server}\": $msg";
234 $msg =
"Memcached error: $msg";
236 $this->logger->error( $msg, $logCtx );
243 $this->
debugLog(
'getMulti(' . implode(
', ',
$keys ) .
')' );
257 $this->
debugLog(
'setMulti(' . implode(
', ', array_keys( $data ) ) .
')' );
258 foreach ( array_keys( $data )
as $key ) {
267 $result = $this->client->touch( $key, $expiry );