Недавно один из разработчиков Composer, Сэлдак (Seldaek), развеял надежды многих на быструю и автоматическую настройку предварительной загрузки проектов с помощью пакетного менеджера. Однако, несмотря на это, возможности для реализации прелоадинга в PHP всё же существуют, и они могут значительно повысить производительность ваших веб-приложений.
Почему Composer не поддерживает прелоадинг?
Сэлдак ясно дал понять, что в ближайшее время функция предварительной загрузки не будет добавлена в Composer. Основная причина заключается в том, что прелоадинг — это проблема развертывания проекта, а не управления зависимостями. Для его реализации требуется модификация файла php.ini
, что находится за пределами задач, решаемых Composer.
Хорошая новость: прелоадинг возможен
Несмотря на ограничения, связанные с Composer, вы всё же можете реализовать прелоадинг в своих проектах. Прелоадинг (или предварительная загрузка) — это мощный инструмент, который позволяет значительно увеличить производительность приложений, загружая определенные классы и файлы в оперативную память на этапе запуска PHP.
Основные принципы прелоадинга
Ключевой вопрос, который необходимо решить при настройке прелоадинга — это не «как загружать файлы», а «какие файлы загружать». Загружать весь фреймворк или множество файлов сразу — не лучшая идея, так как это быстро израсходует доступную память. Более разумный подход — загружать только наиболее востребованные файлы, что требует анализа.
Как определить, что загружать?
Для определения часто используемых файлов можно воспользоваться функцией Opcache, в частности, opcache_get_status()
, которая предоставляет данные о том, к каким файлам чаще всего обращается приложение, а также сколько памяти они используют.
Для получения надежных данных рекомендуется собрать статистику в течение недели (или более короткого периода, в зависимости от нагрузки приложения). Эти данные позволят создать список файлов для прелоадинга, который будет наиболее эффективен.
Знакомьтесь: Preloader
Для автоматизации процесса создания списка предварительной загрузки существует специальный пакет — Preloader. Этот пакет использует данные из Opcache, автоматически составляет список наиболее часто используемых файлов и оптимизирует их порядок, чтобы максимизировать производительность приложения.
Preloader сортирует файлы по частоте использования и исключает из списка файлы самого пакета, чтобы избежать перегрузки памяти. По умолчанию, пакет ограничивает объем памяти, выделяемой для прелоадинга, до 32 МБ, но это значение можно изменить.
Пример использования Preloader
Вот как можно использовать Preloader в вашем проекте:
use DarkGhostHunter\Preloader\Preloader;
Preloader::make()
->autoload('vendor/autoload.php')
->output('preload.php')
->generate();
Этот код создаст скрипт предварительной загрузки, который затем можно включить в файл php.ini
для автоматической загрузки при старте PHP.
Для более гибкого управления процессом вы можете, например, перегенерировать список файлов на основе каждого 100-го запроса:
use DarkGhostHunter\Preloader\Preloader;
Preloader::make()
->whenOneIn(100)
->autoload('vendor/autoload.php')
->output('preload.php')
->overwrite()
->generate();
Вставка в php.ini
После генерации скрипта его необходимо подключить в файл php.ini
через параметр opcache.preload
:
opcache.preload=/www/app/vendor/preload.php
Этот скрипт будет автоматически загружать указанные файлы при старте PHP, что значительно улучшит производительность приложения.
Заключение
Прелоадинг — это мощный инструмент для оптимизации производительности PHP-приложений. Хотя Composer не поддерживает автоматическую настройку прелоадинга, с помощью пакета Preloader вы можете легко реализовать эту функцию в своем проекте. Этот подход особенно полезен для крупных и часто посещаемых сайтов, где каждый миллисекунда важна.