From: Aaron Schulz Date: Thu, 5 Feb 2015 01:10:57 +0000 (-0800) Subject: Avoiding writing sessions for no reason X-Git-Tag: 1.31.0-rc.0~12466 X-Git-Url: http://git.cyclocoop.org/ecrire?a=commitdiff_plain;h=532ef7851c696cbbccecdad365d5dd44486245fd;p=lhc%2Fweb%2Fwiklou.git Avoiding writing sessions for no reason bug: T88635 Change-Id: I4afaecd8dc29390b1ee2a6a77f9ca0cba333ef92 --- diff --git a/includes/objectcache/ObjectCacheSessionHandler.php b/includes/objectcache/ObjectCacheSessionHandler.php index 40b40d1567..24d2a22e43 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 */ @@ -51,8 +54,9 @@ class ObjectCacheSessionHandler { * Get the cache storage object to use for session storage * @return BagOStuff */ - static function getCache() { + protected static function getCache() { global $wgSessionCacheType; + return ObjectCache::getInstance( $wgSessionCacheType ); } @@ -62,10 +66,18 @@ 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. * @@ -95,10 +107,10 @@ 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; } /** @@ -110,7 +122,14 @@ class ObjectCacheSessionHandler { */ 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; }