При запуске приложения Symfony в среде dev панель инструментов веб-отладки позволяет мне узнать, сколько запросов генерирует Doctrine. Есть ли аналогичная опция профилировщика для команд консоли?
Symfony Profiler on Console Command
Ответ 1
Как описано в документах, профилировщик собирает информацию только для всех запросов. Я считаю, что для консольных команд нет коллекционера. Один из способов получить больше информации о запросах, выполняемых Doctrine, - это проверить ваши файлы журналов. Например, вы можете сделать что-то подобное в системах на базе Unix:
tail -f app/logs/dev.log | grep doctrine
Также см.: http://symfony.com/doc/current/book/internals.html#profiler
Ответ 2
Да, --verbose
полезен, как упоминалось в @manolo. Вы можете управлять тем, что выводится в -v
-vv
-vvv
из конфигурации монологического обработчика
monolog:
handlers:
main:
type: stream
path: "%kernel.logs_dir%/%kernel.environment%.log"
level: debug
console:
type: console
bubble: false
verbosity_levels:
VERBOSITY_VERBOSE: INFO
VERBOSITY_VERY_VERBOSE: DEBUG
channels: ["!doctrine"]
console_very_verbose:
type: console
bubble: false
verbosity_levels:
VERBOSITY_VERBOSE: NOTICE
VERBOSITY_VERY_VERBOSE: NOTICE
VERBOSITY_DEBUG: DEBUG
channels: ["doctrine"]
Обратите внимание, что вы даже можете отключить канал -v
или --verbose
будет выводить журналы не доктрины на указанных подробных уровнях.
Ответ 3
Прежде всего, профилировщик symfony зависит от запроса. Вот почему его нельзя использовать в консольных командах из коробки и, вероятно, он не будет исправлен. Связанная проблема с symfony
Но вы по-прежнему можете получить доступ к журналу профилирования DBAL по умолчанию. Это должен быть экземпляр Doctrine\DBAL\Logging\DebugStack Он имеет свойство public query, которое содержит все выполненные запросы, параметры, время выполнения и т.д. Всякий раз, когда вам нужно будет отлаживать актуальные запросы, вы можете сделать это таким образом
/** @var $em Registry */
$em = $this->getContainer()->get('doctrine')->getManager();
$profiler = $this->getContainer()->get('doctrine.dbal.logger.profiling.default');
$shop = $em->getRepository(Shop::class)->find(7);
$sku = $em->getRepository(Sku::class)->find(45);
// clear profiles data, we want to profile Criteria below
$profiler->queries = [];
$shopWares = $shop->getShopWarePagesForSku($sku);
$output->writeln(var_export($profiler->queries));
Он будет генерировать вывод, например
array (
3 =>
array (
'sql' => 'SELECT ...... FROM ShopWarePage t0 WHERE (t0.sku_id = ? AND t0.sku_id = ?)',
'params' =>
array (
0 => 45,
1 => 7,
),
'types' =>
array (
0 => 'integer',
1 => 'integer',
),
'executionMS' => 0.00075292587280273438,
),
)