Как получить статистику запроса доктрины от Symfony2 во время загрузки страницы

Я хотел бы добавить небольшой stat в нижний колонтитул страницы, по строкам '184ms / 6 / 10ms'.

Где 184ms – время генерации страницы, 6 – количество запросов, а 10 – время, затраченное на запросы БД.

Я могу разработать время генерации страницы, но как мне получить статистику базы данных из доктрины?

Это было бы при запуске в среде приложения, конечно, я ценю, когда в app_dev, вероятно, есть способ получить его, как работает профилировщик symfony.

Любая помощь будет оценена по достоинству.

Related of "Как получить статистику запроса доктрины от Symfony2 во время загрузки страницы"

Вы можете сделать это, используя объект DebugStack.

У вас будет массив с каждым запросом и соответствующее время выполнения.

Пример :

$doctrine = $this->get('doctrine'); $doctrineConnection = $doctrine->getConnection(); $stack = new \Doctrine\DBAL\Logging\DebugStack(); $doctrineConnection->getConfiguration()->setSQLLogger($stack); $em = $doctrine->getManager(); ... // Perform query var_dump($stack); 

Пример дампа в $ stack:

 Doctrine\DBAL\Logging\DebugStack Object ( [queries] => Array ( [1] => Array ( [sql] => SELECT t0.id AS id1 FROM Test t0 [params] => Array ( ) [types] => Array ( ) [executionMS] => 0.00018191337585449 ) [2] => Array ( [sql] => SELECT t0.id AS id1 FROM Test t0 [params] => Array ( ) [types] => Array ( ) [executionMS] => 0.00016307830810547 ) ) [enabled] => 1 [start] => 1426590420.2278 [currentQuery] => 2 ) 

Сначала включите профилирование доктрины в config.yml

 doctrine: dbal: ... profiling: true 

Создайте класс Twig Extension следующим образом:

 <?php // src/AppBundle/Twig/AppExtension.pgp namespace AppBundle\Twig; use Doctrine\DBAL\Logging\DebugStack; class AppExtension extends \Twig_Extension { /** * @var DebugStack */ protected $debugStack; /** * AppExtension constructor. * @param DebugStack $debugStack */ function __construct(DebugStack $debugStack) { $this->debugStack = $debugStack; } public function getFunctions() { return [ new \Twig_SimpleFunction('request_time', [$this, 'requestTime'], ['is_safe' => ['html']]), new \Twig_SimpleFunction('query_time', [$this, 'queryTime'], ['is_safe' => ['html']]), new \Twig_SimpleFunction('query_count', [$this, 'queryCount'], ['is_safe' => ['html']]), ]; } /** * Returns application execution time * * @param int $decimals * @return string */ public function requestTime($decimals = 0) { return number_format((microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'])*1000, $decimals); } /** * Returns doctrine query execution time * * @param int $decimals * @return string */ public function queryTime($decimals = 2) { return number_format(array_sum(array_column($this->debugStack->queries, 'executionMS'))*1000, $decimals); } /** * Returns doctrine query count * * @return string */ public function queryCount() { return count($this->debugStack->queries); } } 

Зарегистрируйте свое расширение в services.yml

 services: app.twig_extension: class: AppBundle\Twig\AppExtension arguments: ["@doctrine.dbal.logger.profiling.default"] public: false tags: - { name: twig.extension } 

Используйте его в основном шаблоне ветки, как показано ниже:

{{ query_count() }} , {{ query_time() }} , {{ request_time() }}

Запомнить:

Если вы положили {{ query_count() }} или {{ query_time() }} в начале вашего шаблона, он не покажет вам всех запросов.

Лучшей практикой будет положить их в конец вашего основного шаблона. Если вы хотите показать их в начале, используйте CSS .

Демо-версия: https://mysql-todolist.tk