Как включить предзагрузку файлов с помощью preload.php в PHP?

«Как включить предзагрузку файлов с помощью preload.php в PHP?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Предзагрузка (OPcache preloading) в PHP 7.4+ позволяет загружать определенные файлы в общую память OPcache при старте PHP-FPM, что исключает их компиляцию для каждого запроса и повышает производительность.

Основные шаги:

  1. Создайте скрипт 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');
  2. Настройте php.ini. Укажите путь к скрипту и пользователя.

    opcache.enable=1
    opcache.preload=/absolute/path/to/your/project/preload.php
    opcache.preload_user=www-data # или другой пользователь, от которого работает PHP-FPM
  3. Перезапустите 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).