Профілювальник

Дата оновлення перекладу 2022-11-22

Профілювальник

Профілювальник - це потужний інструмент розробки який надає детальну інформацію про виконання будь-якого запиту.

Caution

Ніколи не підключайте профілювальник у середовищах виробництва, так як це призведе до серйозних вразливостей безпеки вашого додатку.

Установка

У додатках, що використовують Symfony Flex , виконайте цю команду, щоб встановити пакет Symfony profiler перед його використанням:

1
$ composer require --dev symfony/profiler-pack

Тепер, відкрийте будь-яку сторінку вашого додатку у середовищі розробки, щоб дозволити профілювальнику зібрати інформацію. Потім, натисніть на будь-який елемент панелі інструментів налагодження, впровадженої знизу ваших сторінок, щоб відкрити веб-інтерфейс Профілювальника Symfony, який виглядатиме так:

Note

Панель інструментів налагодження впроваджується лише у HTML-відповіді. Для інших типів змісту (наприклад, JSON-відповідей у заптах API) URL профілювальника пдоступний в HTTP-заголовку відповіді X-Debug-Token-Link. Перейдіть по URL /_profiler, щоб побачити всі профілі.

Програмний доступ до даних профілювання

У більшості випадків, доступ та аналіз інформації профілювальника відбувається з використанням його веб-інтерфейсу. Однак, ви також можете вилучити інформацію профілювання пограмно, завдяки методам, наданим сервісом profiler.

Коли доступний обʼєкт відповіді, використайте метод loadProfileFromResponse(), щоб отримати доступ до його асоційованого профілю:

1
2
// ... $profiler - це сервіс 'profiler'
$profile = $profiler->loadProfileFromResponse($response);

Коли профілювальник зберігає дані про запит, він також асоціює з ним токен; цей токен доступний в HTTP-заголовку відповіді X-Debug-Token. Використовуючи цей токен, ви можете отримати доступ до профілю будь-якого попереднього запиту, завдяки методу loadProfile():

1
2
$token = $response->headers->get('X-Debug-Token');
$profile = $profiler->loadProfile($token);

Tip

Коли профілювальник включено, але не у панелі веб-інструментів налагодження, дослідіть сторінку за допомогоб інструментів розробника вашого браузера, щоб отримати значення HTTP-заголовку X-Debug-Token.

Сервіс profiler також надає метод find(), щоб шукати токени, засновуючись на якихось критеріях:

1
2
3
4
5
6
7
8
9
10
11
// отримує останні 10 токенів
$tokens = $profiler->find('', '', 10, '', '', '');

// отримує останні 10 токенів для всіх URL, що містять /admin/
$tokens = $profiler->find('', '/admin/', 10, '', '', '');

// отримує останні 10 токенів для локальних запитів POST
$tokens = $profiler->find('127.0.0.1', '', 10, 'POST', '', '');

// отримує останні 10 токенів для запитів, які відбулися від 2 до 4 днів тому
$tokens = $profiler->find('', '', 10, '', '4 days ago', '2 days ago');

Колектори даних

Профілювальник отримує інформацію, використовуючи деякі сервіси під назвою "колектори даних". Symfony постачається з декількома колекторами, які отирмують інфомацію про запит, логер, машрутизацію, кеш та ін.

Виконайте цю команду, щоб отримати перелік колекторів, дійсно включених у вашому додатку:

1
$ php bin/console debug:container --tag=data_collector

Ви також можете створити власний колектор даних, щоб зберігати будь-які дані, згенеровані вашим додатком, та відображати їх у панелі інструментів налагодження та веб-інтерфейсі профілювальника.

Засікання часу виконання додатку

Якщо ви хочете виміряти час, який займають якісь задачі у вашому додатку, немає необхідності створювати користувацький колектор даних. Натомість, використайте вбудовані утиліти, щоб профілювати додатки Symfony .

Tip

Розгляньте використання професійного профілювальника типу Blackfire, щоб виміряти час та проаналізувати виконання вашого додатку детально.

Включення профілювальника за умовами

Caution

Можливість використовувати зіставник, щоб включати профілювальник за умовами була видалена в Symfony 4.0.

Профілювальник Symfony не може бути включено/відключено за умовами, використовуючи зіставники, так як ця функція була видалена в Symfony 4.0. Однак, ви можете використати методи enable() та disable() класу Profiler у ваших контролерах, щоб управляти профілювальником програмно:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use Symfony\Component\HttpKernel\Profiler\Profiler;
// ...

class DefaultController
{
    // ...

    public function someMethod(?Profiler $profiler)
    {
        // $profiler не буде встановлено, якщо ваше середовище не має профілювальника (як prod, за замовчуванням)
        if (null !== $profiler) {
            // якщо він існує, відключіть профілювальник для цієї конкретної дії контролера
            $profiler->disable();
        }

        // ...
    }
}

Для того, щоб профілювальник був впроваджений у ваш контролер, вам потрібно створити псевдонім, що вказує на існуючий сервіс profiler:

  • YAML
  • XML
  • PHP
1
2
3
# config/services_dev.yaml
services:
    Symfony\Component\HttpKernel\Profiler\Profiler: '@profiler'

Оновлення панелі веб-інструментів налагодження після запитів AJAX

Односторінкові додатки (SPA) - це веб-додатки, які взаємодіють з користувачем, динамічно перреписуючи поточну сторінку, а не завантажуючи цілі нові сторінки з сервера.

За замовчуванням, панель інструментів налагодження відображує інформацію завантаження початкової сторінки і не оновлюється після кожного запиту AJAX. Однак, ви можете встановити заголовок Symfony-Debug-Toolbar-Replace у значення 1 у відповідь на запит AJAX, щоб форсувати оновлення панелі інструментів:

1
$response->headers->set('Symfony-Debug-Toolbar-Replace', 1);

В ідеалі цей заголовок має бути встановлений лише під час розробки і не у виробництві. Щоб зробити це, створіть підписник подій та слухайте подію kernel.response :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use Symfony\Component\HttpKernel\Event\ResponseEvent;

// ...

public function onKernelResponse(ResponseEvent $event)
{
    if (!$event->getKernel()->isDebug()) {
        return;
    }

    $request = $event->getRequest();
    if (!$request->isXmlHttpRequest()) {
        return;
    }

    $response = $event->getResponse();
    $response->headers->set('Symfony-Debug-Toolbar-Replace', 1);
}