Opcache — очистить кеш в PHP5.4 и ниже

Есть ли способ очистки/сброса кэшированных файлов с помощью Opcache с PHP5.4 или ниже?
Вот функция opcache_reset(), которая вроде бы работает с PHP5.5

Обходным путем была перезагрузка...

Изменить: я открыл проблему на Github.


person schickling    schedule 18.07.2013    source источник
comment
Также см. stackoverflow.com/questions/17224798/how-to -use-php-opcache   -  person TerryE    schedule 19.07.2013


Ответы (3)


zend_accelerator_module.c объявляет два задокументированных вызова API: opcache_reset() и opcache_invalidate(), а также два недокументированных: opcache_get_status() и opcache_get_configuration(). То, что они делают, довольно очевидно из источника.

Когда вы выдаете opcache_reset(), это явно будет применяться только к кешу OPcache, который подключен к процессу, выполняющему ваш PHP-скрипт. И да, таких кешей в системе может быть много.

Когда вы opcache.enable_cli=1 выполняете запрос php-cli, OPcache выдает запрос на перезапуск кеша, который подключен к этому процессу; к сожалению, cli SAPI создает частный кеш, так что это не очень хорошо.

Главное, что нужно понять в системах *nix, заключается в том, что OPcache полагается на какой-то базовый менеджер процессов, такой как Apache или FPM, для запуска OPcache, что приводит к mmap() SMA, содержащему кеш. Затем диспетчер процессов разветвляет дочерние процессы, которые обслуживают запросы, а также случайно наследуют область mmapped от родителя.

Поэтому, если вы хотите сбросить кэш OPcache, подключенный к PHP-FPM, вы должны сделать это с помощью скрипта, работающего в службе PHP-FPM. Это должно быть только 4-строчное. Если вы хотите сделать это из командной строки, вы можете использовать wget, curl или сценарий PHP CLI, который использует расширение curl для запуска этого сценария FPM.

Но не забудьте использовать какой-нибудь надежный механизм аутентификации между ними, чтобы предотвратить использование сторонними лицами.

Если вы хотите понять немного больше, я сделал этот обзор: Zend Кэширование движка и кода операции. Если у вас есть отзывы или вопросы, оставьте комментарий здесь или поднимите вопрос на Github.

person TerryE    schedule 19.07.2013
comment
Большое спасибо за ваше подробное объяснение. Решение путем создания скрипта и запуска его через curl довольно прямолинейно, но кажется неправильным или, по крайней мере, не таким простым, как могло бы быть. - person schickling; 19.07.2013
comment
Вы также можете перезагрузить php-fpm, это сделает изящный перезапуск и очистит opcache. - person leeb; 25.10.2013

Посмотрите, доступен ли этот метод с function_exists в вашей среде.

if( function_exists('opcache_reset') ) echo 'yay!';

Хотя он доступен в PHP5.5, потому что opcache поставляется с ним, он также должен стать доступным, если вы установили OpCache в более старую версию php. Я считаю, что это то, что отмечают документы, когда там написано PHP (PHP 5 >= 5.5.0, PECL ZendOpcache >= 7.0.0).

Я также успешно использовал эту быструю и грязную панель управления с PHP 5.4 (использует opcache_ * методы).

Изменить Посмотрев на приведенную выше панель управления, я заметил, что она проверяет версию PHP и наличие opcache_reset.

Кажется, он пытается использовать accelerator_*, а не opcache_* функции.

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

person fideloper    schedule 18.07.2013
comment
Спасибо за Ваш ответ! Функции существуют, но, похоже, не имеют эффекта. Играют ли роль разрешения (какой пользователь запускает opcache_reset)? - person schickling; 18.07.2013
comment
Отличный вопрос, я не уверен. Можете ли вы попробовать использовать этот php-скрипт, связанный с вашим сервером, и посмотреть, работает ли он? Наконец, какие настройки INI вы использовали? Вы уверены, что они вступают в силу? (каково время истечения срока действия вашего кеша?) - person fideloper; 18.07.2013
comment
Очистка кеша с помощью скрипта работает. Запуск от имени www-data php -r "echo function_exists('opcache_reset')?'opcache_':(function_exists('accelerator_reset')?'accelerator_':'');" возвращает opcache_. Я использую PHP-FPM с nginx - person schickling; 19.07.2013
comment
Кажется, что связанный сценарий делает правильную вещь. Там, вероятно, есть ответ - это немного толсто, чтобы пробираться через - person fideloper; 19.07.2013
comment
Возможно, есть два тайника. По одному для каждой реализации php (CLI/FPM). Сценарий ничего не делает, кроме запуска opcache_reset(), но через экземпляр PHP-FPM. Вручную я всегда пытался запустить команду через PHP-CLI. Есть ли способ запустить команду php через PHP-FPM через терминал? (Необходимо для развертывания) - person schickling; 19.07.2013
comment
См. ответ на этот вопрос: stackoverflow.com/questions/7314563/, чтобы получить правильное представление. Я думаю, что самым простым решением было бы использовать скрипт, указанный выше. Чтобы запустить его из командной строки, вы можете использовать curl для создания правильного веб-запроса. Таким образом, вы также можете защитить его на виртуальном хосте, к которому может получить доступ только локальный хост. - person fideloper; 19.07.2013
comment
Ну, я пришел к той же идее. Но кажется неправильным делать это через curl локальный веб-скрипт. Нет ли лучшего способа сделать это? - person schickling; 19.07.2013

Если у вас есть сайт WordPress на вашем сервере, просто установите плагин OPcache Dashboard. Это дает вам интерактивное управление, а также запускает сброс кеша после запуска процесса автоматического обновления Wordpress.

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

opcache.use_cwd=1

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

person Nik Dow    schedule 03.05.2015