Symfony Profiler on Console Command

При запуске приложения Symfony в среде dev панель инструментов веб-отладки позволяет мне узнать, сколько запросов генерирует Doctrine. Есть ли аналогичная опция профилировщика для команд консоли?

Ответ 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,
      ),
    )