vendor/symfony/cache/DataCollector/CacheDataCollector.php line 42

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Component\Cache\DataCollector;
  11. use Symfony\Component\Cache\Adapter\TraceableAdapter;
  12. use Symfony\Component\Cache\Adapter\TraceableAdapterEvent;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\HttpKernel\DataCollector\DataCollector;
  16. use Symfony\Component\HttpKernel\DataCollector\LateDataCollectorInterface;
  17. /**
  18.  * @author Aaron Scherer <aequasi@gmail.com>
  19.  * @author Tobias Nyholm <tobias.nyholm@gmail.com>
  20.  *
  21.  * @final
  22.  */
  23. class CacheDataCollector extends DataCollector implements LateDataCollectorInterface
  24. {
  25.     /**
  26.      * @var TraceableAdapter[]
  27.      */
  28.     private $instances = [];
  29.     public function addInstance(string $nameTraceableAdapter $instance)
  30.     {
  31.         $this->instances[$name] = $instance;
  32.     }
  33.     /**
  34.      * {@inheritdoc}
  35.      */
  36.     public function collect(Request $requestResponse $response\Throwable $exception null)
  37.     {
  38.         $empty = ['calls' => [], 'config' => [], 'options' => [], 'statistics' => []];
  39.         $this->data = ['instances' => $empty'total' => $empty];
  40.         foreach ($this->instances as $name => $instance) {
  41.             $this->data['instances']['calls'][$name] = $instance->getCalls();
  42.         }
  43.         $this->data['instances']['statistics'] = $this->calculateStatistics();
  44.         $this->data['total']['statistics'] = $this->calculateTotalStatistics();
  45.     }
  46.     public function reset()
  47.     {
  48.         $this->data = [];
  49.         foreach ($this->instances as $instance) {
  50.             $instance->clearCalls();
  51.         }
  52.     }
  53.     public function lateCollect()
  54.     {
  55.         $this->data['instances']['calls'] = $this->cloneVar($this->data['instances']['calls']);
  56.     }
  57.     /**
  58.      * {@inheritdoc}
  59.      */
  60.     public function getName(): string
  61.     {
  62.         return 'cache';
  63.     }
  64.     /**
  65.      * Method returns amount of logged Cache reads: "get" calls.
  66.      */
  67.     public function getStatistics(): array
  68.     {
  69.         return $this->data['instances']['statistics'];
  70.     }
  71.     /**
  72.      * Method returns the statistic totals.
  73.      */
  74.     public function getTotals(): array
  75.     {
  76.         return $this->data['total']['statistics'];
  77.     }
  78.     /**
  79.      * Method returns all logged Cache call objects.
  80.      *
  81.      * @return mixed
  82.      */
  83.     public function getCalls()
  84.     {
  85.         return $this->data['instances']['calls'];
  86.     }
  87.     private function calculateStatistics(): array
  88.     {
  89.         $statistics = [];
  90.         foreach ($this->data['instances']['calls'] as $name => $calls) {
  91.             $statistics[$name] = [
  92.                 'calls' => 0,
  93.                 'time' => 0,
  94.                 'reads' => 0,
  95.                 'writes' => 0,
  96.                 'deletes' => 0,
  97.                 'hits' => 0,
  98.                 'misses' => 0,
  99.             ];
  100.             /** @var TraceableAdapterEvent $call */
  101.             foreach ($calls as $call) {
  102.                 ++$statistics[$name]['calls'];
  103.                 $statistics[$name]['time'] += $call->end $call->start;
  104.                 if ('get' === $call->name) {
  105.                     ++$statistics[$name]['reads'];
  106.                     if ($call->hits) {
  107.                         ++$statistics[$name]['hits'];
  108.                     } else {
  109.                         ++$statistics[$name]['misses'];
  110.                         ++$statistics[$name]['writes'];
  111.                     }
  112.                 } elseif ('getItem' === $call->name) {
  113.                     ++$statistics[$name]['reads'];
  114.                     if ($call->hits) {
  115.                         ++$statistics[$name]['hits'];
  116.                     } else {
  117.                         ++$statistics[$name]['misses'];
  118.                     }
  119.                 } elseif ('getItems' === $call->name) {
  120.                     $statistics[$name]['reads'] += $call->hits $call->misses;
  121.                     $statistics[$name]['hits'] += $call->hits;
  122.                     $statistics[$name]['misses'] += $call->misses;
  123.                 } elseif ('hasItem' === $call->name) {
  124.                     ++$statistics[$name]['reads'];
  125.                     if (false === $call->result) {
  126.                         ++$statistics[$name]['misses'];
  127.                     } else {
  128.                         ++$statistics[$name]['hits'];
  129.                     }
  130.                 } elseif ('save' === $call->name) {
  131.                     ++$statistics[$name]['writes'];
  132.                 } elseif ('deleteItem' === $call->name) {
  133.                     ++$statistics[$name]['deletes'];
  134.                 }
  135.             }
  136.             if ($statistics[$name]['reads']) {
  137.                 $statistics[$name]['hit_read_ratio'] = round(100 $statistics[$name]['hits'] / $statistics[$name]['reads'], 2);
  138.             } else {
  139.                 $statistics[$name]['hit_read_ratio'] = null;
  140.             }
  141.         }
  142.         return $statistics;
  143.     }
  144.     private function calculateTotalStatistics(): array
  145.     {
  146.         $statistics $this->getStatistics();
  147.         $totals = [
  148.             'calls' => 0,
  149.             'time' => 0,
  150.             'reads' => 0,
  151.             'writes' => 0,
  152.             'deletes' => 0,
  153.             'hits' => 0,
  154.             'misses' => 0,
  155.         ];
  156.         foreach ($statistics as $name => $values) {
  157.             foreach ($totals as $key => $value) {
  158.                 $totals[$key] += $statistics[$name][$key];
  159.             }
  160.         }
  161.         if ($totals['reads']) {
  162.             $totals['hit_read_ratio'] = round(100 $totals['hits'] / $totals['reads'], 2);
  163.         } else {
  164.             $totals['hit_read_ratio'] = null;
  165.         }
  166.         return $totals;
  167.     }
  168. }