vendor/shopware/core/Profiling/Profiler.php line 61

  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\Profiling;
  3. use Shopware\Core\Framework\Log\Package;
  4. use Shopware\Core\Profiling\Integration\ProfilerInterface;
  5. /**
  6.  * @internal experimental atm
  7.  */
  8. #[Package('core')]
  9. class Profiler
  10. {
  11.     /**
  12.      * Profilers will be activated over the shopware.yaml file
  13.      *
  14.      * All enabled profilers will be added here
  15.      *
  16.      * @var ProfilerInterface[]
  17.      */
  18.     private static array $profilers = [];
  19.     /**
  20.      * Tags will be added to each trace
  21.      *
  22.      * @var array<string>
  23.      */
  24.     private static array $tags = [];
  25.     /**
  26.      * @var array<string>
  27.      */
  28.     private static array $openTraces = [];
  29.     /**
  30.      * @param array<string> $activeProfilers
  31.      */
  32.     public function __construct(
  33.         \Traversable $profilers,
  34.         array $activeProfilers
  35.     ) {
  36.         $profilers iterator_to_array($profilers);
  37.         self::$profilers array_intersect_key($profilersarray_flip($activeProfilers));
  38.         self::$tags = [];
  39.         register_shutdown_function(fn () => self::cleanup());
  40.     }
  41.     /**
  42.      * @return mixed
  43.      */
  44.     public static function trace(string $name\Closure $closurestring $category 'shopware', array $tags = [])
  45.     {
  46.         $tags array_merge(self::$tags$tags);
  47.         try {
  48.             foreach (self::$profilers as $profiler) {
  49.                 $profiler->start($name$category$tags);
  50.             }
  51.             $result $closure();
  52.         } finally {
  53.             foreach (self::$profilers as $profiler) {
  54.                 $profiler->stop($name);
  55.             }
  56.         }
  57.         return $result;
  58.     }
  59.     public static function start(string $titlestring $category, array $tags): void
  60.     {
  61.         self::$openTraces[] = $title;
  62.         $tags array_merge(self::$tags$tags);
  63.         foreach (self::$profilers as $profiler) {
  64.             $profiler->start($title$category$tags);
  65.         }
  66.     }
  67.     public static function stop(string $title): void
  68.     {
  69.         foreach (self::$profilers as $profiler) {
  70.             $profiler->stop($title);
  71.         }
  72.         unset(self::$openTraces[$title]);
  73.     }
  74.     public static function cleanup(): void
  75.     {
  76.         foreach (self::$openTraces as $name) {
  77.             foreach (self::$profilers as $profiler) {
  78.                 $profiler->stop($name);
  79.             }
  80.         }
  81.         self::$openTraces = [];
  82.     }
  83.     public static function addTag(string $keystring $value): void
  84.     {
  85.         self::$tags[$key] = $value;
  86.     }
  87.     public static function removeTag(string $key): void
  88.     {
  89.         unset(self::$tags[$key]);
  90.     }
  91. }