Разбираемся с OpCache
PHP версии 5.5 уже имеет встроенный движок кэширования - OpCache - который сохраняет в памяти прекомпилированный байт-код скрипта. Если вы знакомы с APC или XCache, вы уже имеете представление о том, как такие движки работают. Как каждый скрипт PHP компилируется во время выполнения, часть времени выполнения уходит на то, чтобы преобразовать понятный человеку код в код, который был бы понятен машине.
Движок кэширования байт-кода, OpCache, APC или XCache, делает это только один раз - во время первого исполнения конкретного файла PHP. После этого прекомпилированный скрипт сохраняется в памяти, что должно привести к повышению производительности ваших PHP-приложений.
В Сети вы легко найдете много учебников по установке и настройке OpCache (движок по умолчанию включен в версию PHP 5.5, но вы можете установить его как расширение в более старых версиях). В приведенной ниже статье вы найдете ответы на некоторые распространенные вопросы, касающиеся различных практических аспектов работы с этим кэш-движком.
- 1. Стоит ли вообще устанавливать OpCache? На какой прирост скорости я могу рассчитывать?
- 2. Я уже использую кэширование с помощью APC. Стоит ли мне переходить на OpCache?
- 3. Как проверить, на самом ли деле OpCache кэширует мои файлы?
- Существуют ли какие либо специфические установки конфигурации для конкретных фреймворков, которые я должен задать?
- 5. Я храню настройки конфигурации своих приложений в файле PHP. Могу ли я запретить его кэширование?
- 6. Как я могу работать и со средой разработки, и с рабочей средой на одном сервере, где подключен OpCache?
- Заключение
1. Стоит ли вообще устанавливать OpCache? На какой прирост скорости я могу рассчитывать?
Конечно, это зависит от многих факторов. Если ваш сервер справляется с обработкой входящего трафика и время отклика у вас очень невелико, вероятно, вы не сочтете необходимым работать над увеличением производительности.
Но на большом сайте с большими объемами трафика даже небольшой прирост производительности будет весьма кстати.
Реализация OpCache позволит обрабатывать больше запросов в секунду и возвращать ответ быстрее, чем без движка кэширования байт-кода. Так как OpCache довольно прост в установке и конфигурировании, вся настройка не займет у вас много времени.
Если вам хочется увидеть результаты тестирования OpCache, советую вам прочитать статью AppDynamics по реализации этого кэш-движка.
В результате их тестов после установки OpCache среднее время отклика сайта сократилось на 14%. Снижение времени отклика различных действий веб-приложений составило от 6% до 74%.
Как поясняется в статье, производительность различных частей кода может увеличиться в разной степени. Я рекомендую внимательно прочитать эту статью и решить самим, где вы можете получить высокий прирост производительности.
Если вам нужны будут еще источники, связанные с описанием работы OpCache, ознакомьтесь с материалами, приведенными на fideloper.com и massivescale.com. В обоих случаях тесты показали снижение времени отклика после установки OpCache на 50%.
2. Я уже использую кэширование с помощью APC. Стоит ли мне переходить на OpCache?
Я думаю, стоит. OpCache имеет ряд преимуществ перед APC.
Прежде всего, кэширование APC не будет работать с новейшими версиями PHP. PHP 5.5 он не поддерживает вовсе. Его не рекомендуют устанавливать на PHP 5.4 или, как было сообщено, такая конфигурация может привести к ошибкам выполнения, которые нарушат работу всего приложения.
Просто прочитайте эту статью Википедии по PHP-акселераторам или эту подборку материалов Stack Overflow, если хотите узнать об этом подробнее.
В то же время OpCache поставляется в комплекте с PHP 5.5, так что, безусловно, он нормально работает с этой версией. Как сказано в сопроводительной документации, он также может быть установлен в комбинации с более старыми версиями PHP - от 5.2 до 5.4.
Как правило, OpCache более тесно связан с самим PHP, по сравнению с другими движками кэширования байт-кода – в результате вы будете располагать такими преимуществами, как более частые обновления приложения и меньшее количество ошибок.
Важно только помнить, что при переходе с APC на OpCache последний не работает как движок кэширования данных. Если вы уже реализовали APC, то можете использовать его функции apc_add() и apc_fetch(), которые будут служить в качестве интерфейса для службы кэширования данных.
OpCache является только движком кэширования байт-кода, поэтому он не предлагает аналогичные функциональные возможности по кэшированию данных.
Если вы планируете перейти с APC на OpCache, помните об этом ограничении. Имейте в виду, что если вы хотите сохранить функциональность APC на уровне пользователя, для этого существует специальный проект APCu.
3. Как проверить, на самом ли деле OpCache кэширует мои файлы?
Если вы уже установили и настроили OpCache, для вас может оказаться очень актуальной возможность контролировать, какие PHP-файлы фактически кэшируются. Сам кэш-движок работает в фоновом режиме, и он довольно понятен для пользователей или веб-разработчиков.
Для того чтобы проверить свой статус, вы можете использовать одну из двух функций, которые предоставляют такую информацию: opcache_get_configuration() и opcache_get_status().
Кроме того, существует ряд готовых скриптов, извлекающих все настройки OpCache, а также данные о состоянии и отображающих их в интуитивно понятной форме. Вам не нужно самим составлять никакого дополнительного кода, просто воспользуйтесь одним из инструментов из приведенного ниже списка:
- opcache-status Расмуса Лердорфа;
- OpCacheGUI Петера Нордийка;
- opcache-gui Эндрю Коллингтона.
В своих проектах я использую скрипт opcache-gui, который содержит весь нужный мне функционал. Чтобы проверить, что кэширует движок, просто просмотрите данные, приведенные на вкладке “Overview” страницы графического интерфейса opcache-gui.
Если в соответствующей строке указано, что использование памяти и значение количества переходов больше нуля, это означает, что OpCache кэширует код PHP, а кэшированные файлы используются для обработки запросов.
Чтобы увидеть перечень конкретных PHP файлов, которые кэшируются, просто перейдите к вкладке “File usage”. Просмотрите приведенный там список файлов, чтобы убедиться, что файлы ваших проектов кэшируются:

4. Существуют ли какие либо специфические установки конфигурации для конкретных фреймворков, которые я должен задать?
В принципе, движок OpCache должен быть вполне понятен для вас. Это означает, что вы можете встроить в ваше приложение любой нужный вам код (который совместим с используемой версией PHP) и OpCache должен справиться с ним без проблем.
Но это будет работать, только если конфигурация OpCache задана надлежащим образом. Неправильная конфигурация движка кэширования может поломать весь сайт.
Прежде всего, для каждого типового проекта вам следует установить значение true для опции opcache.use_cwd. Включение этого параметра означает, что движок OpCache будет просматривать полный путь к файлу и различать файлы с одинаковыми именами, но разными путями. Установка значения false приведет к конфликту между разными файлами с одинаковыми именами.
Существует также параметр, который важен для инструментов и фреймворков, использующих аннотации. Если вы работаете с Doctrine, Zend Framework 2 или PHP Unit, не забудьте установить значение true для opcache.load_comments и opcache.save_comments.
В этом случае сопроводительные комментарии документации также будут включены в прекомпилированный код, сгенерированный OpCache. Включение этой опции позволит вам нормально работать с аннотациями.
Если ваш проект базируется на каком-то одном конкретном фреймворке или веб-приложении, всегда стоит ознакомиться с документацией на предмет настроек конфигурации OpCache. Например, существуют специальные настройки для Moodle.
5. Я храню настройки конфигурации своих приложений в файле PHP. Могу ли я запретить его кэширование?
Если ваш проект содержит файлы, которые изменяются намного чаще, чем другие части приложения, вы можете исключить их из кэширования. Это может быть особенно удобно при работе с файлом PHP, содержащим директивы конфигурации сайта.
Если вы запретите их кэширование, то будете уверены, что каждое изменение, хранящееся в таком файле, будет отображаться в вашем приложении сразу же.
OpCache позволяет указать черный список файлов, содержащий все полные пути к файлам, которые не будут обрабатываться движком кэширования. После установки директивы opcache.blacklist_filename, просто добавьте список файлов, которые вы не хотите кэшировать.
На этой странице документации вы сможете найти примеры того, как исключить из кэша определенные файлы.
6. Как я могу работать и со средой разработки, и с рабочей средой на одном сервере, где подключен OpCache?
Если ваш сервер работает с несколькими приложениями, вы можете настроить OpCache таким образом, чтобы он использовался только некоторыми из них. Разработка сайтов и тестирование являются примерами сред, для которых подключение кэширования байт-кода является нежелательным. Это может принести больше вреда, чем пользы.
К счастью, вы можете использовать функции OpCache для одного проекта и отключить его для другого, все на одном сервере. Для этого сначала нужно включить OpCache на глобальном уровне, установив в файле php.ini значение true для директивы opcache.enable.
Затем, если вы не хотите использовать кэширование байт-кода для одного из ваших проектов, просто отключите его, установив для той же директивы значение false с помощью функции ini_set().
Таким образом, сначала вы должны включить кэширование глобально, а затем вы можете отключить его для некоторых проектов «локально». Вы не можете сделать наоборот - включение кэширования с помощью ini_set () невозможно.
Установив значение false для opcache.enable в верхней части файла в вашем проекте, вы отключите кэширование для этого конкретного проекта, сохраняя его для всех прочих.
Заключение
Я надеюсь, что ответы на эти вопросы дали вам практическую информацию о том, как использовать OpCache в PHP-приложениях. Если у вас есть другие вопросы или замечания относительно темы данной статьи, оставьте их в комментариях.