Я хотел бы добавить небольшой stat в нижний колонтитул страницы, по строкам '184ms / 6 / 10ms'.
Где 184ms – время генерации страницы, 6 – количество запросов, а 10 – время, затраченное на запросы БД.
Я могу разработать время генерации страницы, но как мне получить статистику базы данных из доктрины?
Это было бы при запуске в среде приложения, конечно, я ценю, когда в app_dev, вероятно, есть способ получить его, как работает профилировщик symfony.
Любая помощь будет оценена по достоинству.
Вы можете сделать это, используя объект 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