* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Cache\Simple; use Psr\SimpleCache\CacheInterface; use Symfony\Component\Cache\PruneableInterface; use Symfony\Component\Cache\ResettableInterface; /** * An adapter that collects data about all cache calls. * * @author Nicolas Grekas
*/ class TraceableCache implements CacheInterface, PruneableInterface, ResettableInterface { private $pool; private $miss; private $calls = array(); public function __construct(CacheInterface $pool) { $this->pool = $pool; $this->miss = new \stdClass(); } /** * {@inheritdoc} */ public function get($key, $default = null) { $miss = null !== $default && \is_object($default) ? $default : $this->miss; $event = $this->start(__FUNCTION__); try { $value = $this->pool->get($key, $miss); } finally { $event->end = microtime(true); } if ($event->result[$key] = $miss !== $value) { ++$event->hits; } else { ++$event->misses; $value = $default; } return $value; } /** * {@inheritdoc} */ public function has($key) { $event = $this->start(__FUNCTION__); try { return $event->result[$key] = $this->pool->has($key); } finally { $event->end = microtime(true); } } /** * {@inheritdoc} */ public function delete($key) { $event = $this->start(__FUNCTION__); try { return $event->result[$key] = $this->pool->delete($key); } finally { $event->end = microtime(true); } } /** * {@inheritdoc} */ public function set($key, $value, $ttl = null) { $event = $this->start(__FUNCTION__); try { return $event->result[$key] = $this->pool->set($key, $value, $ttl); } finally { $event->end = microtime(true); } } /** * {@inheritdoc} */ public function setMultiple($values, $ttl = null) { $event = $this->start(__FUNCTION__); $event->result['keys'] = array(); if ($values instanceof \Traversable) { $values = function () use ($values, $event) { foreach ($values as $k => $v) { $event->result['keys'][] = $k; yield $k => $v; } }; $values = $values(); } elseif (\is_array($values)) { $event->result['keys'] = array_keys($values); } try { return $event->result['result'] = $this->pool->setMultiple($values, $ttl); } finally { $event->end = microtime(true); } } /** * {@inheritdoc} */ public function getMultiple($keys, $default = null) { $miss = null !== $default && \is_object($default) ? $default : $this->miss; $event = $this->start(__FUNCTION__); try { $result = $this->pool->getMultiple($keys, $miss); } finally { $event->end = microtime(true); } $f = function () use ($result, $event, $miss, $default) { $event->result = array(); foreach ($result as $key => $value) { if ($event->result[$key] = $miss !== $value) { ++$event->hits; } else { ++$event->misses; $value = $default; } yield $key => $value; } }; return $f(); } /** * {@inheritdoc} */ public function clear() { $event = $this->start(__FUNCTION__); try { return $event->result = $this->pool->clear(); } finally { $event->end = microtime(true); } } /** * {@inheritdoc} */ public function deleteMultiple($keys) { $event = $this->start(__FUNCTION__); if ($keys instanceof \Traversable) { $keys = $event->result['keys'] = iterator_to_array($keys, false); } else { $event->result['keys'] = $keys; } try { return $event->result['result'] = $this->pool->deleteMultiple($keys); } finally { $event->end = microtime(true); } } /** * {@inheritdoc} */ public function prune() { if (!$this->pool instanceof PruneableInterface) { return false; } $event = $this->start(__FUNCTION__); try { return $event->result = $this->pool->prune(); } finally { $event->end = microtime(true); } } /** * {@inheritdoc} */ public function reset() { if (!$this->pool instanceof ResettableInterface) { return; } $event = $this->start(__FUNCTION__); try { $this->pool->reset(); } finally { $event->end = microtime(true); } } public function getCalls() { try { return $this->calls; } finally { $this->calls = array(); } } private function start($name) { $this->calls[] = $event = new TraceableCacheEvent(); $event->name = $name; $event->start = microtime(true); return $event; } } class TraceableCacheEvent { public $name; public $start; public $end; public $result; public $hits = 0; public $misses = 0; } __halt_compiler();----SIGNATURE:----OtT+6YZc20BsvhbF1nt3vjTjMO486UaAPIXQtGdUqfF4SlZ6duHwqX80HsHF51Y0z84yFEagKY6vRbElDfKTydwENPKbLS98FANsWYEF1sVd/aTZ7qrN2lScvMkeWNPlBVkZ5+h8mYhmyN2RzJu/+dhlEP8tx+VpOM8Y1Eou4AADa/MkUEziPO+idu5Qcy0r7yCNfU0C6KNLLvc6pEXz0PIu1Ddq1zaQ4J+uah2K4b71xyhTnDrLEzOx/sqprWXBqc1HJPhNp7GMP2Bk6Q3w5/Zr5z8+zH4sCGXjxw5OEO6Wu9+ZDkMPbieeABEE/8y+bIyMe1CtJIKeJL3Q2Vm4fZuKUnn5DfLvc93YDuoeFpOH3yzLPPygT/bzve80lRx9I6QMOJ/Kcz0M3ANsuOBMMiDy+1jNu5oRtSNffZvs+QZunZxe2IeeSw93GtkbYa1tN772yPr8tjZN21QCIRgmaBRmc6uVRBzhqSCjBYfYmdDqlsiAyHW7vwWKruKtWghz7pPG4JSzHRoqLo+wsSPS46yUmFbLuqXipYb2Yfji9+WGa237cemvoEv/mm2GsvJPF2i0vCOdxlH6b+1odaqsp+/57enLtDukadJbs6SYvEs33OzYyOQLADbm6WgagPBCOMqf8I/1NQ2nLuwfKvOBi8vmss+TWMCA47Bv9OcLbns=----ATTACHMENT:----Njc4MjE1NDE2MTQzNzc5MiA1NzQyMzgxMzMxMzM4MzQ0IDY1Mzc3MDk3NjQyOTczMjM=