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