Статьи

Понимание OpCache

PHP в версии 5.5 поставляется со встроенным механизмом кэширования — OpCache, который хранит байт-код предварительно скомпилированного скрипта в памяти. Если вы знакомы с APC или Xcache, вы уже знаете, как работают такие движки. Поскольку каждый сценарий PHP компилируется во время выполнения, часть времени выполнения используется для преобразования читаемого человеком кода в код, понятный для машины. Механизм кэширования байт-кода, такой как OpCache, APC или Xcache, делает это только один раз — во время первого выполнения определенного файла PHP. Затем предварительно скомпилированный скрипт сохраняется в памяти, что должно привести к повышению производительности в ваших PHP-приложениях.

В Интернете вы легко найдете множество учебных пособий, охватывающих все этапы установки и настройки OpCache (он включен по умолчанию в 5.5, но может быть установлен как расширение в более старых версиях). Прочитайте статью ниже, чтобы найти ответы на некоторые типичные вопросы, касающиеся различных практических аспектов работы с этим конкретным механизмом кэширования.

1. Стоит ли вообще устанавливать OpCache? Какой прирост скорости я могу ожидать?

Конечно, это зависит. Если вашему серверу удается обработать входящий трафик и поддерживать низкое время отклика, вы, вероятно, не почувствуете необходимости работать над производительностью. Но на больших сайтах с большим трафиком каждый маленький шаг оптимизации может иметь значение. Реализация OpCache может позволить вам обрабатывать больше запросов в секунду и возвращать ответ быстрее, чем без механизма кэширования байт-кода. Поскольку OpCache довольно прост в установке и настройке, вы не будете тратить слишком много времени на настройку.

Если вам нужны некоторые тесты производительности OpCache, вам непременно следует прочитать статью AppDynamics о реализации этого механизма кэширования. В своих тестах установка OpCache сократила среднее время ответа веб-сайта на 14%. Сокращение времени отклика различных действий веб-приложения варьировалось от 6% до 74%. Как объясняется в статье, различные части кода могут более или менее выиграть от реализации механизма кэширования байт-кода. Я рекомендую вам прочитать статью подробно и проверить, где вы можете получить максимальный прирост производительности.

Если вы ищете другие ресурсы, касающиеся производительности OpCache, посмотрите примеры на fideloper.com и massscale.com . Оба теста сообщили об уменьшении времени отклика примерно на 50% после установки OpCache.

2. Я уже использую APC кеш. Должен ли я перейти на OpCache?

Я думаю, тебе следует. Есть несколько преимуществ, которые могут сделать OpCache лучшим решением, чем APC.

Прежде всего, кэш APC не будет работать с новейшими версиями PHP. Он вообще не поддерживает PHP 5.5. Также не рекомендуется устанавливать его на PHP 5.4, так как сообщалось, что такая конфигурация может привести к ошибкам выполнения, которые нарушают работу всего приложения. Просто посмотрите статью в Википедии о PHP-ускорителях или этот поток переполнения стека, чтобы получить некоторые подробности.

OpCache, однако, поставляется с PHP 5.5, поэтому он определенно будет работать с этой версией PHP. Как написано в документации , он также может быть установлен с более старыми версиями 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 ,
opcache-статус от Расмуса Лердорфа,
OpCacheGUI от Питера Хордика,
opcache-gui от Эндрю Коллингтона.

В своих проектах я использую скрипт opcache-gui, который обладает всеми необходимыми мне функциями. Чтобы проверить, работает ли механизм кэширования, просто посмотрите проценты на вкладке «Обзор» на странице opcache-gui. Если значения использования памяти и частоты попаданий больше нуля, это означает, что OpCache кэширует код PHP, а кэшированные файлы используются для обработки запросов. Чтобы увидеть список конкретных файлов PHP, которые кэшируются, просто перейдите на вкладку «Использование файлов». Просмотрите список файлов, чтобы убедиться, что файлы в ваших проектах кэшируются.

4. Есть ли какая-либо специфичная для фреймворка конфигурация, которую я должен установить?

По сути, движок OpCache должен быть прозрачен для вас, как для составителя кода. Это означает, что вы можете поместить любой код в свое приложение (которое работает с используемой версией PHP), и OpCache должен правильно его обрабатывать. Но это будет работать, только если конфигурация OpCache установлена ​​правильно. Неправильная конфигурация механизма кэширования может сломать весь ваш сайт.

Прежде всего, вероятно, в каждом типичном проекте вам нужно убедиться, что для опции opcache.use_cwd установлено значение true Включение этого параметра означает, что механизм OpCache будет просматривать полные пути к файлам, чтобы различать файлы с одинаковыми именами. Установка его в false

Существует также параметр, который важен в инструментах и ​​средах, которые используют аннотации . Если вы используете Doctrine, Zend Framework 2 или PHP Unit, не забудьте установить для параметров opcache.load_comments и opcache.save_comments значение true В результате комментарии к документации из ваших файлов также будут включены в предварительно скомпилированный код, сгенерированный OpCache. Этот параметр позволит вам работать с аннотациями без сбоев.

Если ваш проект основан на конкретной инфраструктуре или веб-приложении, всегда полезно проверить документацию на предмет каких-либо рекомендаций, касающихся конфигурации OpCache. Например, здесь приведен пример конфигурации для Moodle.

5. Я храню конфигурацию своего приложения в файле PHP. Могу ли я предотвратить его кэширование?

Если ваш проект содержит файлы, которые изменяются чаще, чем другие, вы можете исключить их из кэширования. Это может быть особенно удобно при работе с файлами PHP, которые содержат директивы конфигурации для вашего сайта. Если вы не допустите их кэширования, вы можете быть уверены, что каждое изменение, внесенное в такой файл, будет немедленно отображаться в вашем приложении.

OpCache позволяет вам указать файл черного списка, который содержит все пути, которые не будут обработаны механизмом кэширования. После установки директивы opcache.blacklist_filename просто поместите правильный список файлов в указанный вами путь. Страница документации содержит несколько примеров того, как исключить определенные файлы из кэша.

6. Как я могу запустить как среду разработки, так и производственную среду на одном сервере, на котором включен OpCache?

Если на вашем сервере запущено несколько приложений, возможно, вы захотите использовать OpCache только в некоторых из них. Сайты разработки и тестирования являются примерами таких сред, в которых включение кэширования байт-кода нежелательно и может принести больше вреда, чем пользы.

К счастью, OpCache можно включить в одном проекте и отключить в другом, все на одном сервере. Для этого сначала необходимо включить OpCache на глобальном уровне, установив для директивы opcache.enable значение truephp.ini Затем, если вы не хотите использовать кэширование байт-кода в одном из ваших проектов, просто отключите его, установив для этой же директивы значение falseini_set () . Поэтому сначала вам нужно включить глобальное кэширование, а затем вы можете отключить его в некоторых проектах «локально». Вы не можете сделать наоборот — включение кэширования с помощью ini_set () не допускается.

Если для opcache.enablefalse

Резюме

Я надеюсь, что этот набор общих вопросов и ответов дал вам некоторую практическую информацию о том, как использовать OpCache в приложении PHP. Если у вас есть другие вопросы или комментарии по этому вопросу, не стесняйтесь размещать их ниже. Вы также можете связаться со мной через Google Plus .