Новое в Symfony 5.1: настраиваемая предварительная загрузка PHP

Предварительная загрузка классов PHP – одна из самых важных функций, добавленных в PHP 7.4. При запуске сервера – перед запуском любого кода приложения – PHP может загрузить определенный набор файлов PHP в память и сделать их содержимое постоянно доступным для всех последующих запросов.

Во время предварительной загрузки PHP также разрешает зависимости классов и связи с родителями, интерфейсами и признаками. Он также удаляет ненужные включения и выполняет некоторые другие оптимизации. Общий результат – очень значительное улучшение производительности в реальных приложениях.

Symfony совместим с предварительной загрузкой PHP начиная с версии 4.4. В Symfony 5.1 улучшили предварительную загрузку, чтобы упростить настройку благодаря двум новым тегам внедрения зависимостей, которые называются container.preload и container.no_preload.

Во-первых, container.preload позволяет вам определить, какие классы должны быть предварительно загружены PHP. Добавьте один или несколько из этих тегов в свои службы, чтобы предварительно загрузить столько классов, сколько вам нужно. Например, в коде Symfony мы используем этот тег для предварительной загрузки некоторых классов, связанных со службой веток:

services:
    twig:
        class: Twig\Environment
        # ...
        tags:
            - { name: 'container.preload', class: 'Twig\Cache\FilesystemCache' }
            - { name: 'container.preload', class: 'Twig\Extension\CoreExtension' }
            - { name: 'container.preload', class: 'Twig\Extension\EscaperExtension' }
            - { name: 'container.preload', class: 'Twig\Extension\OptimizerExtension' }
            # ...

Тег container.no_preload используется для указания PHP, что он не должен предварительно загружать определенный класс. В этом случае тег не определяет атрибут класса. Вместо этого примените тег к некоторому сервису, и класс, связанный с этим сервисом, не будет предварительно загружен:

services:
    twig.template_cache_warmer:
        class: Symfony\Bundle\TwigBundle\CacheWarmer\TemplateCacheWarmer
        # ...
        tags:
            - { name: 'container.no_preload' }

Еще одно изменение, связанное с предварительной загрузкой PHP, заключается в том, что метод warmUp() подогревателей кэша Symfony теперь должен возвращать массив с FQCN (полными именами классов) классов для разогрева. Это не рекомендуется с Symfony 5.1.

Уже реализовали все эти функции в коде Symfony. В результате в их синтетических тестах пример приложения увеличился с 360 запросов в секунду до 630 запросов в секунду, что означает повышение производительности на 75%.