/**
* This is a wrapper for APC's shared memory functions
*
+ * Use PHP serialization to avoid bugs and easily create CAS tokens.
+ * APCu has a memory corruption bug when the serializer is set to 'default'.
+ * See T120267, and upstream bug reports:
+ * - https://github.com/krakjoe/apcu/issues/38
+ * - https://github.com/krakjoe/apcu/issues/35
+ * - https://github.com/krakjoe/apcu/issues/111
+ *
* @ingroup Cache
*/
class APCBagOStuff extends BagOStuff {
-
- /**
- * @var bool If true, trust the APC implementation to serialize and
- * deserialize objects correctly. If false, (de-)serialize in PHP.
- */
- protected $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 = ':2';
-
- /**
- * Available parameters are:
- * - nativeSerialize: If true, pass objects to apc_store(), and trust it
- * to serialize them correctly. If false, serialize
- * all values in PHP.
- *
- * @param array $params
- */
- public function __construct( array $params = [] ) {
- parent::__construct( $params );
-
- if ( isset( $params['nativeSerialize'] ) ) {
- $this->nativeSerialize = $params['nativeSerialize'];
- } elseif ( extension_loaded( 'apcu' ) && ini_get( 'apc.serializer' ) === 'default' ) {
- // APCu has a memory corruption bug when the serializer is set to 'default'.
- // See T120267, and upstream bug reports:
- // - https://github.com/krakjoe/apcu/issues/38
- // - https://github.com/krakjoe/apcu/issues/35
- // - https://github.com/krakjoe/apcu/issues/111
- $this->logger->warning(
- 'The APCu extension is loaded and the apc.serializer INI setting ' .
- 'is set to "default". This can cause memory corruption! ' .
- 'You should change apc.serializer to "php" instead. ' .
- 'See <https://github.com/krakjoe/apcu/issues/38>.'
- );
- $this->nativeSerialize = false;
- } else {
- $this->nativeSerialize = true;
- }
- }
+ const KEY_SUFFIX = ':3';
protected function doGet( $key, $flags = 0, &$casToken = null ) {
$casToken = null;
}
protected function serialize( $value ) {
- if ( !$this->nativeSerialize && !$this->isInteger( $value ) ) {
- $value = serialize( $value );
- }
- return $value;
+ return $this->isInteger( $value ) ? (int)$value : serialize( $value );
}
protected function unserialize( $value ) {
- if ( is_string( $value ) && !$this->nativeSerialize ) {
- $value = $this->isInteger( $value )
- ? intval( $value )
- : unserialize( $value );
- }
- return $value;
+ return $this->isInteger( $value ) ? (int)$value : unserialize( $value );
}
}
/**
* This is a wrapper for APCU's shared memory functions
*
+ * Use PHP serialization to avoid bugs and easily create CAS tokens.
+ * APCu has a memory corruption bug when the serializer is set to 'default'.
+ * See T120267, and upstream bug reports:
+ * - https://github.com/krakjoe/apcu/issues/38
+ * - https://github.com/krakjoe/apcu/issues/35
+ * - https://github.com/krakjoe/apcu/issues/111
+ *
* @ingroup Cache
*/
-class APCUBagOStuff extends APCBagOStuff {
+class APCUBagOStuff extends BagOStuff {
/**
- * Available parameters are:
- * - nativeSerialize: If true, pass objects to apcu_store(), and trust it
- * to serialize them correctly. If false, serialize
- * all values in PHP.
- *
- * @param array $params
+ * @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.
*/
- public function __construct( array $params = [] ) {
- parent::__construct( $params );
- }
+ const KEY_SUFFIX = ':3';
protected function doGet( $key, $flags = 0, &$casToken = null ) {
$casToken = null;
return false;
}
}
+
+ protected function serialize( $value ) {
+ return $this->isInteger( $value ) ? (int)$value : serialize( $value );
+ }
+
+ protected function unserialize( $value ) {
+ return $this->isInteger( $value ) ? (int)$value : unserialize( $value );
+ }
}