* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * This class can be used to cache the result and output of any PHP callable (function and method calls). * * @package symfony * @subpackage cache * @author Fabien Potencier * @version SVN: $Id: sfFunctionCache.class.php 23939 2009-11-14 17:46:14Z fabien $ */ class sfFunctionCache { protected $cache = null; /** * Constructor. * * @param sfCache $cache An sfCache object instance */ public function __construct(sfCache $cache) { $this->cache = $cache; } /** * Calls a cacheable function or method (or not if there is already a cache for it). * * Arguments of this method are read with func_get_args. So it doesn't appear in the function definition. * * The first argument can be any PHP callable: * * $cache->call('functionName', array($arg1, $arg2)); * $cache->call(array($object, 'methodName'), array($arg1, $arg2)); * * @param mixed $callable A PHP callable * @param array $arguments An array of arguments to pass to the callable * * @return mixed The result of the function/method */ public function call($callable, $arguments = array()) { // Generate a cache id $key = $this->computeCacheKey($callable, $arguments); $serialized = $this->cache->get($key); if ($serialized !== null) { $data = unserialize($serialized); } else { $data = array(); if (!is_callable($callable)) { throw new sfException('The first argument to call() must be a valid callable.'); } ob_start(); ob_implicit_flush(false); try { $data['result'] = call_user_func_array($callable, $arguments); } catch (Exception $e) { ob_end_clean(); throw $e; } $data['output'] = ob_get_clean(); $this->cache->set($key, serialize($data)); } echo $data['output']; return $data['result']; } /** * Returns the cache instance. * * @return sfCache The sfCache instance */ public function getCache() { return $this->cache; } /** * Computes the cache key for a given callable and the arguments. * * @param mixed $callable A PHP callable * @param array $arguments An array of arguments to pass to the callable * * @return string The associated cache key */ public function computeCacheKey($callable, $arguments = array()) { return md5(serialize($callable).serialize($arguments)); } }