Предварительная загрузка классов 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%.