attrMap[self::ATTR_DURABILITY] = ini_get( 'apc.enable_cli' ) ? self::QOS_DURABILITY_SCRIPT : self::QOS_DURABILITY_NONE; } else { $this->attrMap[self::ATTR_DURABILITY] = self::QOS_DURABILITY_SERVICE; } } protected function doGet( $key, $flags = 0, &$casToken = null ) { $getToken = ( $casToken === self::PASS_BY_REF ); $casToken = null; $value = apcu_fetch( $key . self::KEY_SUFFIX ); if ( $getToken && $value !== false ) { // Note that if the driver handles serialization then this uses the PHP value // as the token. This might require inspection or re-serialization in doCas(). $casToken = $value; } return $value; } protected function doSet( $key, $value, $exptime = 0, $flags = 0 ) { $ttl = $this->getExpirationAsTTL( $exptime ); return apcu_store( $key . self::KEY_SUFFIX, $value, $ttl ); } protected function doAdd( $key, $value, $exptime = 0, $flags = 0 ) { if ( apcu_exists( $key . self::KEY_SUFFIX ) ) { // Avoid global write locks for high contention keys return false; } $ttl = $this->getExpirationAsTTL( $exptime ); return apcu_add( $key . self::KEY_SUFFIX, $value, $ttl ); } protected function doDelete( $key, $flags = 0 ) { apcu_delete( $key . self::KEY_SUFFIX ); return true; } protected function doIncrWithInit( $key, $exptime, $step, $init, $flags ) { // Use apcu 5.1.12 $ttl argument if apcu_inc() will initialize to $init: // https://www.php.net/manual/en/function.apcu-inc.php if ( $step === $init ) { /** @noinspection PhpMethodParametersCountMismatchInspection */ $ttl = $this->getExpirationAsTTL( $exptime ); $result = apcu_inc( $key . self::KEY_SUFFIX, $step, $success, $ttl ); } else { $result = false; for ( $i = 0; $i < self::$CAS_MAX_ATTEMPTS; ++$i ) { $oldCount = apcu_fetch( $key . self::KEY_SUFFIX ); if ( $oldCount === false ) { $count = $init; $ttl = $this->getExpirationAsTTL( $exptime ); if ( apcu_add( $key . self::KEY_SUFFIX, $count, $ttl ) ) { $result = $count; break; } } elseif ( is_int( $oldCount ) ) { $count = $oldCount + $step; if ( apcu_cas( $key . self::KEY_SUFFIX, $oldCount, $count ) ) { $result = $count; break; } } else { break; } } } return $result; } } /** @deprecated class alias since 1.43 */ class_alias( APCUBagOStuff::class, 'APCUBagOStuff' );