Ответ
Предзагрузка (OPcache preloading) в PHP 7.4+ позволяет загружать определенные файлы в общую память OPcache при старте PHP-FPM, что исключает их компиляцию для каждого запроса и повышает производительность.
Основные шаги:
-
Создайте скрипт
preload.php. Его задача — подключить файлы, которые должны быть предзагружены. Обычно это файлы с классами и функциями фреймворка или ядра приложения.<?php // preload.php $preload = function (string $directory): void { $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($directory) ); foreach ($iterator as $file) { if ($file->isFile() && $file->getExtension() === 'php') { // require_once вместо include, чтобы избежать дублирования require_once $file->getPathname(); } } }; // Предзагружаем каталоги с кодом фреймворка и приложения $preload(__DIR__ . '/vendor/laravel/framework/src'); $preload(__DIR__ . '/app/Models'); -
Настройте
php.ini. Укажите путь к скрипту и пользователя.opcache.enable=1 opcache.preload=/absolute/path/to/your/project/preload.php opcache.preload_user=www-data # или другой пользователь, от которого работает PHP-FPM -
Перезапустите PHP-FPM.
sudo systemctl restart php8.1-fpm # версия может отличаться
Критические ограничения и best practices:
- Изменения требуют перезапуска. Любое изменение в предзагруженном файле (или добавление нового класса в предзагружаемую директорию) не вступит в силу, пока вы не обновите
preload.phpи не перезапустите PHP-FPM. - Не предзагружайте часто меняющийся код. Это касается пользовательского кода приложения, который активно разрабатывается. Предзагрузка наиболее эффективна для стабильных зависимостей (фреймворк, библиотеки).
- Контролируйте объем памяти. Каждый предзагруженный файл занимает память в OPcache. Используйте
opcache_get_status()для мониторинга. - Проверьте логи. При ошибках в
preload.php(например, отсутствующий файл) PHP не запустится — проверяйте логи PHP-FPM (journalctl -u php8.1-fpm).