diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/services.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/services.xml
index 2c0072d85d9a1..ec6128553ff73 100644
--- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/services.xml
+++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/services.xml
@@ -32,6 +32,8 @@
+ %kernel.debug%
+ %kernel.cache_dir%/%kernel.container_class%Deprecations.log
diff --git a/src/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerAggregate.php b/src/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerAggregate.php
index 8a57732bf3848..4d63804be7d67 100644
--- a/src/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerAggregate.php
+++ b/src/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmerAggregate.php
@@ -21,12 +21,16 @@
class CacheWarmerAggregate implements CacheWarmerInterface
{
private $warmers;
+ private $debug;
+ private $deprecationLogsFilepath;
private $optionalsEnabled = false;
private $onlyOptionalsEnabled = false;
- public function __construct(iterable $warmers = array())
+ public function __construct(iterable $warmers = array(), bool $debug = false, string $deprecationLogsFilepath = null)
{
$this->warmers = $warmers;
+ $this->debug = $debug;
+ $this->deprecationLogsFilepath = $deprecationLogsFilepath;
}
public function enableOptionalWarmers()
@@ -46,15 +50,62 @@ public function enableOnlyOptionalWarmers()
*/
public function warmUp($cacheDir)
{
- foreach ($this->warmers as $warmer) {
- if (!$this->optionalsEnabled && $warmer->isOptional()) {
- continue;
- }
- if ($this->onlyOptionalsEnabled && !$warmer->isOptional()) {
- continue;
+ if ($this->debug) {
+ $collectedLogs = array();
+ $previousHandler = defined('PHPUNIT_COMPOSER_INSTALL');
+ $previousHandler = $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;
+ }
+
+ $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] = array(
+ 'type' => $type,
+ 'message' => $message,
+ 'file' => $file,
+ 'line' => $line,
+ 'trace' => $backtrace,
+ 'count' => 1,
+ );
+ });
+ }
+
+ try {
+ foreach ($this->warmers as $warmer) {
+ if (!$this->optionalsEnabled && $warmer->isOptional()) {
+ continue;
+ }
+ if ($this->onlyOptionalsEnabled && !$warmer->isOptional()) {
+ continue;
+ }
+
+ $warmer->warmUp($cacheDir);
}
+ } finally {
+ if ($this->debug && true !== $previousHandler) {
+ restore_error_handler();
- $warmer->warmUp($cacheDir);
+ if (file_exists($this->deprecationLogsFilepath)) {
+ $previousLogs = unserialize(file_get_contents($this->deprecationLogsFilepath));
+ $collectedLogs = array_merge($previousLogs, $collectedLogs);
+ }
+
+ file_put_contents($this->deprecationLogsFilepath, serialize(array_values($collectedLogs)));
+ }
}
}