From: Jeroen De Dauw Date: Tue, 20 Mar 2012 00:04:36 +0000 (+0000) Subject: follow up to r114215, fix some fails and added CachedAction implementing the same... X-Git-Tag: 1.31.0-rc.0~24186 X-Git-Url: http://git.heureux-cyclage.org/?a=commitdiff_plain;h=3cad6eb042b2e9d783654f737e2c230f53933eb4;p=lhc%2Fweb%2Fwiklou.git follow up to r114215, fix some fails and added CachedAction implementing the same stuff as SpecialCachedPage --- diff --git a/includes/AutoLoader.php b/includes/AutoLoader.php index adf7834559..53da8b439b 100644 --- a/includes/AutoLoader.php +++ b/includes/AutoLoader.php @@ -259,6 +259,7 @@ $wgAutoloadLocalClasses = array( 'ZipDirectoryReader' => 'includes/ZipDirectoryReader.php', # includes/actions + 'CachedAction' => 'includes/actions/CachedAction.php', 'CreditsAction' => 'includes/actions/CreditsAction.php', 'DeleteAction' => 'includes/actions/DeleteAction.php', 'EditAction' => 'includes/actions/EditAction.php', diff --git a/includes/CacheHelper.php b/includes/CacheHelper.php index b61e2ada2a..92f1d46447 100644 --- a/includes/CacheHelper.php +++ b/includes/CacheHelper.php @@ -1,5 +1,13 @@ + */ interface ICacheHelper { /** @@ -22,18 +30,20 @@ interface ICacheHelper { function startCache( $cacheExpiry = null, $cacheEnabled = null ); /** - * Add some HTML to be cached. - * This is done by providing a callback function that should - * return the HTML to be added. It will only be called if the - * item is not in the cache yet or when the cache has been invalidated. + * Get a cached value if available or compute it if not and then cache it if possible. + * The provided $computeFunction is only called when the computation needs to happen + * and should return a result value. $args are arguments that will be passed to the + * compute function when called. * * @since 1.20 * * @param {function} $computeFunction - * @param array $args + * @param array|mixed $args * @param string|null $key + * + * @return mixed */ - function addCachedHTML( $computeFunction, $args = array(), $key = null ); + function getCachedValue( $computeFunction, $args = array(), $key = null ); /** * Saves the HTML to the cache in case it got recomputed. @@ -73,7 +83,6 @@ interface ICacheHelper { * @since 1.20 * * @file CacheHelper.php - * @ingroup SpecialPage * * @licence GNU GPL v2 or later * @author Jeroen De Dauw < jeroendedauw@gmail.com > @@ -216,24 +225,6 @@ class CacheHelper implements ICacheHelper { } } - - - /** - * Add some HTML to be cached. - * This is done by providing a callback function that should - * return the HTML to be added. It will only be called if the - * item is not in the cache yet or when the cache has been invalidated. - * - * @since 1.20 - * - * @param {function} $computeFunction - * @param array $args - * @param string|null $key - */ - public function addCachedHTML( $computeFunction, $args = array(), $key = null ) { - $this->getOutput()->addHTML( $this->getCachedValue( $computeFunction, $args, $key ) ); - } - /** * Get a cached value if available or compute it if not and then cache it if possible. * The provided $computeFunction is only called when the computation needs to happen diff --git a/includes/actions/CachedAction.php b/includes/actions/CachedAction.php new file mode 100644 index 0000000000..5a2264a0cd --- /dev/null +++ b/includes/actions/CachedAction.php @@ -0,0 +1,161 @@ +getCachedValue( $callback ); + * + * To add HTML that should be cached, use addCachedHTML like this: + * $this->addCachedHTML( $callback ); + * + * The callback function is only called when needed, so do all your expensive + * computations here. This function should returns the HTML to be cached. + * It should not add anything to the PageOutput object! + * + * @since 1.20 + * + * @file CachedAction.php + * @ingroup Action + * + * @licence GNU GPL v2 or later + * @author Jeroen De Dauw < jeroendedauw@gmail.com > + */ +abstract class CachedAction extends FormlessAction implements ICacheHelper { + + /** + * CacheHelper object to which we foreward the non-SpecialPage specific caching work. + * Initialized in startCache. + * + * @since 1.20 + * @var CacheHelper + */ + protected $cacheHelper; + + /** + * Sets if the cache should be enabled or not. + * + * @since 1.20 + * @param boolean $cacheEnabled + */ + public function setCacheEnabled( $cacheEnabled ) { + $this->cacheHelper->setCacheEnabled( $cacheEnabled ); + } + + /** + * Initializes the caching. + * Should be called before the first time anything is added via addCachedHTML. + * + * @since 1.20 + * + * @param integer|null $cacheExpiry Sets the cache expirty, either ttl in seconds or unix timestamp. + * @param boolean|null $cacheEnabled Sets if the cache should be enabled or not. + */ + public function startCache( $cacheExpiry = null, $cacheEnabled = null ) { + $this->cacheHelper = new CacheHelper( $this->get ); + + $this->cacheHelper->setOnInitializedHandler( array( $this, 'onCacheInitialized' ) ); + + $keyArgs = $this->getCacheKey(); + + if ( array_key_exists( 'action', $keyArgs ) && $keyArgs['action'] === 'purge' ) { + unset( $keyArgs['action'] ); + } + + $this->cacheHelper->setCacheKey( $keyArgs ); + + if ( $this->getRequest()->getText( 'action' ) === 'purge' ) { + $this->cacheHelper->purge(); + } + + $this->cacheHelper->startCache( $cacheExpiry, $cacheEnabled ); + } + + /** + * Get a cached value if available or compute it if not and then cache it if possible. + * The provided $computeFunction is only called when the computation needs to happen + * and should return a result value. $args are arguments that will be passed to the + * compute function when called. + * + * @since 1.20 + * + * @param {function} $computeFunction + * @param array|mixed $args + * @param string|null $key + * + * @return mixed + */ + public function getCachedValue( $computeFunction, $args = array(), $key = null ) { + return $this->cacheHelper->getCachedValue( $computeFunction, $args, $key ); + } + + /** + * Add some HTML to be cached. + * This is done by providing a callback function that should + * return the HTML to be added. It will only be called if the + * item is not in the cache yet or when the cache has been invalidated. + * + * @since 1.20 + * + * @param {function} $computeFunction + * @param array $args + * @param string|null $key + */ + public function addCachedHTML( $computeFunction, $args = array(), $key = null ) { + $this->getOutput()->addHTML( $this->cacheHelper->getCachedValue( $computeFunction, $args, $key ) ); + } + + /** + * Saves the HTML to the cache in case it got recomputed. + * Should be called after the last time anything is added via addCachedHTML. + * + * @since 1.20 + */ + public function saveCache() { + $this->cacheHelper->saveCache(); + } + + /** + * Sets the time to live for the cache, in seconds or a unix timestamp indicating the point of expiry.. + * + * @since 1.20 + * + * @param integer $cacheExpiry + */ + public function setExpirey( $cacheExpiry ) { + $this->cacheHelper->setExpirey( $cacheExpiry ); + } + + /** + * Returns the variables used to constructed the cache key in an array. + * + * @since 1.20 + * + * @return array + */ + protected function getCacheKey() { + return array( + get_class( $this->page ), + $this->getName(), + $this->getLanguage()->getCode() + ); + } + + /** + * Gets called after the cache got initialized. + * + * @since 1.20 + * + * @param boolean $hasCached + */ + public function onCacheInitialized( $hasCached ) { + if ( $hasCached ) { + $this->getOutput()->setSubtitle( $this->cacheHelper->getCachedNotice( $this->getContext() ) ); + } + } + +} \ No newline at end of file diff --git a/includes/specials/SpecialCachedPage.php b/includes/specials/SpecialCachedPage.php index b721c26ff6..eb8e6b9d0c 100644 --- a/includes/specials/SpecialCachedPage.php +++ b/includes/specials/SpecialCachedPage.php @@ -1,7 +1,8 @@ cacheHelper->startCache( $cacheExpiry, $cacheEnabled ); } + /** + * Get a cached value if available or compute it if not and then cache it if possible. + * The provided $computeFunction is only called when the computation needs to happen + * and should return a result value. $args are arguments that will be passed to the + * compute function when called. + * + * @since 1.20 + * + * @param {function} $computeFunction + * @param array|mixed $args + * @param string|null $key + * + * @return mixed + */ + public function getCachedValue( $computeFunction, $args = array(), $key = null ) { + return $this->cacheHelper->getCachedValue( $computeFunction, $args, $key ); + } + /** * Add some HTML to be cached. * This is done by providing a callback function that should