| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 | <?php/* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */namespace Symfony\Component\HttpKernel\CacheWarmer;/** * Aggregates several cache warmers into a single one. * * @author Fabien Potencier <fabien@symfony.com> * * @final */class CacheWarmerAggregate implements CacheWarmerInterface{    private $warmers;    private $debug;    private $deprecationLogsFilepath;    private $optionalsEnabled = false;    private $onlyOptionalsEnabled = false;    /**     * @param iterable<mixed, CacheWarmerInterface> $warmers     */    public function __construct(iterable $warmers = [], bool $debug = false, string $deprecationLogsFilepath = null)    {        $this->warmers = $warmers;        $this->debug = $debug;        $this->deprecationLogsFilepath = $deprecationLogsFilepath;    }    public function enableOptionalWarmers()    {        $this->optionalsEnabled = true;    }    public function enableOnlyOptionalWarmers()    {        $this->onlyOptionalsEnabled = $this->optionalsEnabled = true;    }    /**     * {@inheritdoc}     */    public function warmUp(string $cacheDir): array    {        if ($collectDeprecations = $this->debug && !\defined('PHPUNIT_COMPOSER_INSTALL')) {            $collectedLogs = [];            $previousHandler = set_error_handler(function ($type, $message, $file, $line) use (&$collectedLogs, &$previousHandler) {                if (\E_USER_DEPRECATED !== $type && \E_DEPRECATED !== $type) {                    return $previousHandler ? $previousHandler($type, $message, $file, $line) : false;                }                if (isset($collectedLogs[$message])) {                    ++$collectedLogs[$message]['count'];                    return null;                }                $backtrace = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 3);                // Clean the trace by removing first frames added by the error handler itself.                for ($i = 0; isset($backtrace[$i]); ++$i) {                    if (isset($backtrace[$i]['file'], $backtrace[$i]['line']) && $backtrace[$i]['line'] === $line && $backtrace[$i]['file'] === $file) {                        $backtrace = \array_slice($backtrace, 1 + $i);                        break;                    }                }                $collectedLogs[$message] = [                    'type' => $type,                    'message' => $message,                    'file' => $file,                    'line' => $line,                    'trace' => $backtrace,                    'count' => 1,                ];                return null;            });        }        $preload = [];        try {            foreach ($this->warmers as $warmer) {                if (!$this->optionalsEnabled && $warmer->isOptional()) {                    continue;                }                if ($this->onlyOptionalsEnabled && !$warmer->isOptional()) {                    continue;                }                $preload[] = array_values((array) $warmer->warmUp($cacheDir));            }        } finally {            if ($collectDeprecations) {                restore_error_handler();                if (is_file($this->deprecationLogsFilepath)) {                    $previousLogs = unserialize(file_get_contents($this->deprecationLogsFilepath));                    if (\is_array($previousLogs)) {                        $collectedLogs = array_merge($previousLogs, $collectedLogs);                    }                }                file_put_contents($this->deprecationLogsFilepath, serialize(array_values($collectedLogs)));            }        }        return array_values(array_unique(array_merge([], ...$preload)));    }    /**     * {@inheritdoc}     */    public function isOptional(): bool    {        return false;    }}
 |