* @ingroup Cache
*/
class APCBagOStuff extends BagOStuff {
+ /** @var bool Whether to trust the APC implementation to serialization */
+ private $nativeSerialize;
+
/**
* @var string String to append to each APC key. This may be changed
* whenever the handling of values is changed, to prevent existing code
* from encountering older values which it cannot handle.
*/
- const KEY_SUFFIX = ':3';
+ const KEY_SUFFIX = ':4';
+
+ public function __construct( array $params = [] ) {
+ parent::__construct( $params );
+ // The extension serializer is still buggy, unlike "php" and "igbinary"
+ $this->nativeSerialize = ( ini_get( 'apc.serializer' ) !== 'default' );
+ }
protected function doGet( $key, $flags = 0, &$casToken = null ) {
$casToken = null;
$blob = apc_fetch( $key . self::KEY_SUFFIX );
- $value = $this->unserialize( $blob );
+ $value = $this->nativeSerialize ? $blob : $this->unserialize( $blob );
if ( $value !== false ) {
$casToken = $blob; // don't bother hashing this
}
public function set( $key, $value, $exptime = 0, $flags = 0 ) {
apc_store(
$key . self::KEY_SUFFIX,
- $this->serialize( $value ),
+ $this->nativeSerialize ? $value : $this->serialize( $value ),
$exptime
);
public function add( $key, $value, $exptime = 0, $flags = 0 ) {
return apc_add(
$key . self::KEY_SUFFIX,
- $this->serialize( $value ),
+ $this->nativeSerialize ? $value : $this->serialize( $value ),
$exptime
);
}
public function __construct( array $params = [] ) {
parent::__construct( $params );
- // The extension serialize is still buggy, unlike "php" and "igbinary"
+ // The extension serializer is still buggy, unlike "php" and "igbinary"
$this->nativeSerialize = ( ini_get( 'apc.serializer' ) !== 'default' );
}