diff options
Diffstat (limited to 'includes/objectcache/ObjectCacheSessionHandler.php')
-rw-r--r-- | includes/objectcache/ObjectCacheSessionHandler.php | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/includes/objectcache/ObjectCacheSessionHandler.php b/includes/objectcache/ObjectCacheSessionHandler.php index cdf8da1e..789f1e3b 100644 --- a/includes/objectcache/ObjectCacheSessionHandler.php +++ b/includes/objectcache/ObjectCacheSessionHandler.php @@ -28,6 +28,9 @@ * @ingroup Cache */ class ObjectCacheSessionHandler { + /** @var array Map of (session ID => SHA-1 of the data) */ + protected static $hashCache = array(); + /** * Install a session handler for the current web request */ @@ -49,10 +52,11 @@ class ObjectCacheSessionHandler { /** * Get the cache storage object to use for session storage - * @return ObjectCache + * @return BagOStuff */ - static function getCache() { + protected static function getCache() { global $wgSessionCacheType; + return ObjectCache::getInstance( $wgSessionCacheType ); } @@ -62,11 +66,19 @@ class ObjectCacheSessionHandler { * @param string $id Session id * @return string Cache key */ - static function getKey( $id ) { + protected static function getKey( $id ) { return wfMemcKey( 'session', $id ); } /** + * @param mixed $data + * @return string + */ + protected static function getHash( $data ) { + return sha1( serialize( $data ) ); + } + + /** * Callback when opening a session. * * @param string $save_path Path used to store session files, unused @@ -95,22 +107,29 @@ class ObjectCacheSessionHandler { */ static function read( $id ) { $data = self::getCache()->get( self::getKey( $id ) ); - if ( $data === false ) { - return ''; - } - return $data; + + self::$hashCache = array( $id => self::getHash( $data ) ); + + return ( $data === false ) ? '' : $data; } /** * Callback when writing session data. * * @param string $id Session id - * @param mixed $data Session data + * @param string $data Session data * @return bool Success */ static function write( $id, $data ) { global $wgObjectCacheSessionExpiry; - self::getCache()->set( self::getKey( $id ), $data, $wgObjectCacheSessionExpiry ); + + // Only issue a write if anything changed (PHP 5.6 already does this) + if ( !isset( self::$hashCache[$id] ) + || self::getHash( $data ) !== self::$hashCache[$id] + ) { + self::getCache()->set( self::getKey( $id ), $data, $wgObjectCacheSessionExpiry ); + } + return true; } @@ -122,6 +141,7 @@ class ObjectCacheSessionHandler { */ static function destroy( $id ) { self::getCache()->delete( self::getKey( $id ) ); + return true; } |