From: Matthias Mullie Date: Mon, 9 Dec 2013 14:15:13 +0000 (+0100) Subject: Move code to load User data from cache out of loadFromId X-Git-Tag: 1.31.0-rc.0~13871^2 X-Git-Url: http://git.cyclocoop.org/%24image?a=commitdiff_plain;h=d695ef0cd1c67d24c6ab998e12648c6449a7718e;p=lhc%2Fweb%2Fwiklou.git Move code to load User data from cache out of loadFromId This way, outside code can load data from cache only if present. E.g. when data for a lot of users is needed, it'd be preferable to batch-load all that is not yet in cache. Since there's currently no way to check for data in cache, one would have to load all User objects separately (which may result in lots of DB queries if nothing is in cache) or batch-load all of them (which may result in few DB queries, but ones that may not be needed if all data is already in cache) Change-Id: Ia22d04744760c3b6f3264786434e218b8aa88d53 --- diff --git a/includes/User.php b/includes/User.php index 635b1e9258..989701306d 100644 --- a/includes/User.php +++ b/includes/User.php @@ -357,21 +357,14 @@ class User implements IDBAccessObject { * @return bool False if the ID does not exist, true otherwise */ public function loadFromId() { - global $wgMemc; if ( $this->mId == 0 ) { $this->loadDefaults(); return false; } // Try cache - $key = wfMemcKey( 'user', 'id', $this->mId ); - $data = $wgMemc->get( $key ); - if ( !is_array( $data ) || $data['mVersion'] != self::VERSION ) { - // Object is expired, load from DB - $data = false; - } - - if ( !$data ) { + $cache = $this->loadFromCache(); + if ( !$cache ) { wfDebug( "User: cache miss for user {$this->mId}\n" ); // Load from DB if ( !$this->loadFromDatabase() ) { @@ -379,12 +372,6 @@ class User implements IDBAccessObject { return false; } $this->saveToCache(); - } else { - wfDebug( "User: got user {$this->mId} from cache\n" ); - // Restore from cache - foreach ( self::$mCacheVars as $name ) { - $this->$name = $data[$name]; - } } $this->mLoadedItems = true; @@ -392,6 +379,37 @@ class User implements IDBAccessObject { return true; } + /** + * Load user data from shared cache, given mId has already been set. + * + * @return bool false if the ID does not exist or data is invalid, true otherwise + * @since 1.25 + */ + public function loadFromCache() { + global $wgMemc; + + if ( $this->mId == 0 ) { + $this->loadDefaults(); + return false; + } + + $key = wfMemcKey( 'user', 'id', $this->mId ); + $data = $wgMemc->get( $key ); + if ( !is_array( $data ) || $data['mVersion'] < self::VERSION ) { + // Object is expired + return false; + } + + wfDebug( "User: got user {$this->mId} from cache\n" ); + + // Restore from cache + foreach ( self::$mCacheVars as $name ) { + $this->$name = $data[$name]; + } + + return true; + } + /** * Save user data to the shared cache */