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'] ) ) {
143 if ( defined( Memcached::class .
'::GET_EXTENDED' ) ) {
144 $flags = Memcached::GET_EXTENDED;
146 if ( is_array(
$res ) ) {
147 $result =
$res[
'value'];
148 $casToken =
$res[
'cas'];
160 public function set( $key,
$value, $exptime = 0, $flags = 0 ) {
162 $result = parent::set( $key,
$value, $exptime );
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 ) {
192 $result = $this->client->increment( $key,
$value );
198 $result = $this->client->decrement( $key,
$value );
214 if ( $result !==
false ) {
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 ) .
')' );
244 foreach (
$keys as $key ) {
247 $result = $this->client->getMulti(
$keys ) ?: [];
256 public function setMulti( array $data, $exptime = 0 ) {
257 $this->
debugLog(
'setMulti(' . implode(
', ', array_keys( $data ) ) .
')' );
258 foreach ( array_keys( $data ) as $key ) {
261 $result = $this->client->setMulti( $data, $this->
fixExpiry( $exptime ) );
267 $result = $this->client->touch( $key, $expiry );
setLastError( $err)
Set the "last error" registry.
Base class for memcached clients.
validateKeyEncoding( $key)
Ensure that a key is safe to use (contains no control characters and no characters above the ASCII ra...
debugLog( $text)
Send a debug message to the log.
fixExpiry( $expiry)
TTLs higher than 30 days will be detected as absolute TTLs (UNIX timestamps), and will result in the ...
A wrapper class for the PECL memcached client.
add( $key, $value, $exptime=0)
setMulti(array $data, $exptime=0)
decr( $key, $value=1)
Decrease stored value of $key by $value while preserving its TTL.
getMulti(array $keys, $flags=0)
Get an associative array containing the item for each of the keys that have items.
getWithToken( $key, &$casToken, $flags=0)
checkResult( $key, $result)
Check the return value from a client method call and take any necessary action.
__construct( $params)
Available parameters are:
incr( $key, $value=1)
Increase stored value of $key by $value while preserving its TTL.
changeTTL( $key, $expiry=0)
Reset the TTL on a key if it exists.
applyDefaultParams( $params)
Fill in some defaults for missing keys in $params.
cas( $casToken, $key, $value, $exptime=0)
Check and set an item.
The phpstorm stubs package includes the Memcached class with two parameters and docs saying that they...
namespace being checked & $result
processing should stop and the error should be shown to the user * false