控制台命令上的Symfony Profiler

时间:2014-04-18 16:43:35

标签: symfony

在开发环境中运行Symfony应用程序时,Web调试工具栏允许我查看Doctrine生成的查询数量。控制台命令是否有类似的探查器选项?

3 个答案:

答案 0 :(得分:5)

如文档中所述,探查器仅收集所有请求的信息。我相信控制台命令没有收集器。深入了解Doctrine执行的查询的方法之一是检查日志文件。例如,您可以在基于Unix的系统上执行类似的操作:

tail -f app/logs/dev.log | grep doctrine

另见:http://symfony.com/doc/current/book/internals.html#profiler

答案 1 :(得分:4)

是的,--verbose对@manolo提到很有用。您可以从monolog处理程序配置

中控制-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只会以指定的详细级别输出非教条日志。

答案 2 :(得分:2)

首先,symfony profiler依赖于Request。这就是为什么它不能在开箱即用的控制台命令中使用,可能,它不会被修复。 Related symfony issue

但您仍然可以访问默认的DBAL分析记录器。它应该是Doctrine \ DBAL \ Logging \ DebugStack的实例 它具有公共查询属性,包含所有已执行的查询,参数,执行时间等。 每当您需要调试实际查询时 - 您可以这样做

    /** @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,
      ),
    )