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 );
69 $this->client->setOption( Memcached::OPT_RETRY_TIMEOUT,
$params[
'retry_timeout'] );
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] ];
119 $servers[] = [ $m[1], (
int)$m[2] ];
121 $servers[] = [ $host,
false ];
124 $this->client->addServers( $servers );
131 $params[
'use_binary_protocol'] =
false;
144 protected function doGet( $key, $flags = 0, &$casToken =
null ) {
146 if ( defined( Memcached::class .
'::GET_EXTENDED' ) ) {
147 $flags = Memcached::GET_EXTENDED;
150 $result =
$res[
'value'];
151 $casToken =
$res[
'cas'];
163 public function set( $key,
$value, $exptime = 0, $flags = 0 ) {
165 $result = parent::set( $key,
$value, $exptime, $flags = 0 );
166 if ( $result ===
false && $this->client->getResultCode() === Memcached::RES_NOTSTORED ) {
173 protected function cas( $casToken, $key,
$value, $exptime = 0, $flags = 0 ) {
175 return $this->
checkResult( $key, parent::cas( $casToken, $key,
$value, $exptime, $flags ) );
178 public function delete( $key, $flags = 0 ) {
180 $result = parent::delete( $key );
181 if ( $result ===
false && $this->client->getResultCode() === Memcached::RES_NOTFOUND ) {
188 public function add( $key,
$value, $exptime = 0, $flags = 0 ) {
195 $result = $this->client->increment( $key,
$value );
201 $result = $this->client->decrement( $key,
$value );
217 if ( $result !==
false ) {
220 switch ( $this->client->getResultCode() ) {
221 case Memcached::RES_SUCCESS:
223 case Memcached::RES_DATA_EXISTS:
224 case Memcached::RES_NOTSTORED:
225 case Memcached::RES_NOTFOUND:
226 $this->
debugLog(
"result: " . $this->client->getResultMessage() );
229 $msg = $this->client->getResultMessage();
231 if ( $key !==
false ) {
232 $server = $this->client->getServerByKey( $key );
233 $logCtx[
'memcached-server'] =
"{$server['host']}:{$server['port']}";
234 $logCtx[
'memcached-key'] = $key;
235 $msg =
"Memcached error for key \"{memcached-key}\" on server \"{memcached-server}\": $msg";
237 $msg =
"Memcached error: $msg";
239 $this->logger->error( $msg, $logCtx );
246 $this->
debugLog(
'getMulti(' . implode(
', ',
$keys ) .
')' );
247 foreach (
$keys as $key ) {
250 $result = $this->client->getMulti(
$keys ) ?: [];
259 $result = $this->client->setMulti(
$data, $this->
fixExpiry( $exptime ) );
263 public function changeTTL( $key, $expiry = 0, $flags = 0 ) {
265 $result = $this->client->touch( $key, $expiry );
and that you know you can do these things To protect your we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights These restrictions translate to certain responsibilities for you if you distribute copies of the or if you modify it For if you distribute copies of such a whether gratis or for a you must give the recipients all the rights that you have You must make sure that receive or can get the source code And you must show them these terms so they know their rights We protect your rights with two and(2) offer you this license which gives you legal permission to copy
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.
setMulti(array $data, $exptime=0, $flags=0)
Batch insertion/replace.
doGet( $key, $flags=0, &$casToken=null)
@suppress PhanTypeNonVarPassByRef
decr( $key, $value=1)
Decrease stored value of $key by $value while preserving its TTL.
cas( $casToken, $key, $value, $exptime=0, $flags=0)
Check and set an item.
getMulti(array $keys, $flags=0)
Get an associative array containing the item for each of the keys that have items.
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.
add( $key, $value, $exptime=0, $flags=0)
Insert an item if it does not already exist.
applyDefaultParams( $params)
Fill in some defaults for missing keys in $params.
changeTTL( $key, $expiry=0, $flags=0)
Change the expiration on a key if it exists.
namespace being checked & $result
processing should stop and the error should be shown to the user * false
$data
Utility to generate mapping file used in mw.Title (phpCharToUpper.json)
The wiki should then use memcached to cache various data To use multiple just add more items to the array To increase the weight of a make its entry a array("192.168.0.1:11211", 2))