Модули кэширования PHP. Как ускорить работу сайта
При каждом вашем запросе к серверу выполняется преобразование PHP кода в удобочитаемый машинный язык. Выходит, что система производит однотипные действия для каждого нового пользователя. Для самой процедуры компиляции скриптов идет немало времени, в результате чего могут возникнуть проблемы с производительностью и нагрузкой. Обойти эту проблему можно сохранив код операции в виде кэша после его компиляции, и выдавать при повторных запросах.
Используя кэширование данных можно не только значительно улучшить производительность сервера, а и уменьшить использования серверных ресурсов на обработку скриптов. Само кэширование является процессом сохранения часто запрашиваемых объектов в памяти для более быстрой выдачи при повторных запросах с целью оптимизации работы сервера.
Можно выделить два основных типа кэширования:
- кэш кода операции PHP. Интерпретатор обрабатывает сценарии PHP по зазначеному алгоритму, при этом идёт чтение файла, генерация байт-кода, выполнение запроса и выдача результата. На все идет много затрат по времени и мощностей сервера. Чтобы этого избежать и ускорить выдачу, кэш кода операции хранит уже скомпилированные ранее сценарии PHP. Серверу не нужно компилировать и преобразовывает скрипт PHP в машинно-понятный код при каждом запросе. Скомпилированные сценарии PHP хранятся в памяти на сервере, на котором производилась компиляция. Использование такого вида кэширования дает возможность серверу обрабатывать намного больше одновременно поступивших запросов, что играет важную роль для высокой производительности и стабильной работы больших сайтов и приложений.
- кэш данных. Кэш данных хранит копии данных, шаблонов и других типов часто запрашиваемых информационных файлов, сохраняя трудоемкие вычисляемые данные в кэше. В зависимости от реализации и использования кэша он может быть локальным для одного сервера или распределенным по нескольким серверам.
Для серверов работающих на Linux: популярным решением есть PHP OPcache. А для приложений PHP, работающих в Windows и Windows Server, существует альтернативный ускоритель PHP под названием Windows Cache Extension. Рассмотрим более подробно особенности каждого из них и какие существуют альтернативы.
OPcache
OPcache — это тип кэширования OPcode. Это мощное расширение PHP, созданное для повышения производительности PHP. Он работает, сохраняя предварительно скомпилированный байт-код скрипта в разделяемой памяти, тем самым избавляя PHP от необходимости загружать и анализировать скрипты при каждом запросе. Opcache имеет три уровня кеша: исходный кеш общей памяти, файловый кэш, и функцию предварительной загрузки, добавленную в PHP 7.4. PHP OPcache также применяет дополнительные шаблоны оптимизации байт-кода, чтобы ускорить выполнение кода PHP.
APCu
Одним из самых старых технологий пользовательского кэша является APCu. APCu пришел на смену APC. APCu — это бесплатный ускоритель PHP с открытым исходным кодом. В большинстве случаев используется для кэширования вывода кода операции PHP в общей памяти сервера. Сейчас используется крайне редко.
Redis
Redis - это отличный современный кэш памяти, который можно использовать как для распределенного кэширования, так и в качестве локального кэша для блокировки транзакций файлов, поскольку он гарантирует, что кэшированные объекты доступны столько времени, сколько они необходимы. Многие пользователи отмечают сложность в настройке и использовании, хотя является одним из лучших решений по кэшированию на данный момент.
Windows Cache Extension
Как писалось выше для Windows популярным и самым ходовым решением есть Windows Cache Extension, который совмещает в себе несколько типов кэширования:
- хранит байт-код PHP, ранее скомпилированного сценария PHP, в памяти, делая его доступным, когда необходимы последующие выполнения того же сценария, что помогает повысить общую производительность приложения PHP.
- включает кэш файловой системы, который используется для хранения содержимого файлов сценариев PHP в общей памяти, что уменьшает количество операций файловой системы, выполняемых механизмом PHP.
- кэширует связь между относительными и абсолютными путями к файлам, уменьшая количество разрешений относительных путей, выполняемых механизмом PHP. Приложения, использующие много относительных путей, будут работать быстрее, если преобразования в абсолютные пути выполняется только один раз.
- предоставляет API-интерфейсы пользовательского кэша, которые могут использоваться для хранения объектов и переменных в общей памяти. Таким образом, может увеличиться скорость выполнения операций, за счет сохранения обработанных данные в кэше и затем используя их в последующих запросах вместо повторного создания данных при каждом запросе.