← Назад к вопросам

Для чего нужен файл preload.php?

2.7 Senior🔥 121 комментариев
#PHP Core#Инфраструктура и DevOps

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Назначение файла preload.php в PHP

Файл preload.php — это специальный конфигурационный файл, который появился в PHP 7.4 как часть механизма OPcache Preloading (предзагрузки). Его основное назначение — повышение производительности PHP-приложений за счёт предварительной компиляции и загрузки в память часто используемых классов, функций, интерфейсов и трейтов при старте PHP-FPM или веб-сервера.

Как работает предзагрузка (Preloading)

Без предзагрузки каждый PHP-скрипт при выполнении должен:

  1. Читать файлы с диска
  2. Компилировать их в байт-код
  3. Выполнять байт-код

С предзагрузкой процесс оптимизируется:

  • При запуске PHP (например, при старте PHP-FPM) выполняется preload.php
  • Указанные в нём файлы компилируются в байт-код и помещаются в общую память OPcache
  • При последующих запросах эти файлы сразу доступны в скомпилированном виде

Структура типичного preload.php

<?php
// preload.php

// Предзагрузка классов фреймворка
require_once __DIR__ . '/vendor/symfony/http-foundation/Request.php';
require_once __DIR__ . '/vendor/symfony/http-foundation/Response.php';
require_once __DIR__ . '/vendor/doctrine/orm/EntityManager.php';

// Предзагрузка собственных классов
require_once __DIR__ . '/src/Domain/User.php';
require_once __DIR__ . '/src/Domain/Product.php';
require_once __DIR__ . '/src/Application/Service/PaymentService.php';

// Можно использовать рекурсивное сканирование директорий
$directory = new RecursiveDirectoryIterator(__DIR__ . '/src/Domain');
$iterator = new RecursiveIteratorIterator($directory);

foreach ($iterator as $file) {
    if ($file->isFile() && $file->getExtension() === 'php') {
        require_once $file->getPathname();
    }
}

// Предзагрузка функций (если нужно)
if (function_exists('opcache_compile_file')) {
    opcache_compile_file(__DIR__ . '/src/helpers.php');
}

Ключевые преимущества использования preload.php

1. Увеличение производительности

  • Снижение времени компиляции PHP-кода при каждом запросе
  • Уменьшение накладных расходов на ввод-вывод (I/O)
  • Особенно заметно в микросервисных архитектурах и приложениях с большим количеством классов

2. Эффективное использование OPcache

  • Предзагруженные файлы остаются в памяти постоянно
  • Не вытесняются другими скриптами (как при обычном кэшировании)
  • Доступны всем воркерам PHP-FPM без повторной компиляции

3. Улучшение отзывчивости приложения

  • Стабильное время выполнения запросов
  • Предсказуемая производительность под нагрузкой

Ограничения и особенности

Ограничения:

  • Работает только с OPcache (требует opcache.enable=1 и opcache.preload=preload.php)
  • Предзагруженные классы нельзя изменить без перезапуска PHP-FPM
  • Увеличивает потребление памяти (все предзагруженные классы хранятся в памяти постоянно)

Рекомендации по использованию:

  • Предзагружайте только стабильные, редко изменяемые классы
  • Избегайте предзагрузки классов, которые могут меняться в runtime
  • Включайте в preload.php ядро фреймворка, часто используемые библиотеки
  • Мониторьте использование памяти после внедрения предзагрузки

Конфигурация в php.ini

; Включение OPcache
opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16

; Настройки предзагрузки
opcache.preload=/path/to/preload.php
opcache.preload_user=www-data ; пользователь, от которого выполняется preload

Практический пример для Laravel/Symfony

Для современных фреймворков часто используют автоматическую генерацию preload.php:

<?php
// Генерация preload.php для Symfony
$classMap = require __DIR__ . '/vendor/composer/autoload_classmap.php';

foreach ($classMap as $class => $file) {
    // Исключаем тестовые классы и классы разработки
    if (strpos($file, '/vendor/') !== false && 
        !strpos($file, '/vendor/bin/') &&
        !strpos($file, '/vendor/composer/')) {
        require_once $file;
    }
}

Вывод

Файл preload.php — это мощный инструмент оптимизации производительности PHP-приложений, который особенно эффективен в production-среде с постоянной нагрузкой. При правильной настройке он может дать прирост производительности от 10% до 50% в зависимости от архитектуры приложения. Однако его использование требует тщательного планирования и мониторинга, так как неправильная конфигурация может привести к избыточному потреблению памяти или необходимости частых перезапусков сервиса.