Развертывание нового кода PHP при запуске Opcache

0

Мы пытаемся развернуть новый код PHP через Capistrano при запуске Opcache.

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

Проблема, с которой мы сталкиваемся, заключается в том, что Opcache исчерпывает память, потому что каждое новое развертывание приводит к кэшированию всей базы кода, а старый код никогда не выдается. Мы могли бы вызвать opcache_reset(), но когда кеш сбрасывается, мы кратковременно получаем 500 ошибок, когда отбрасывает тайники. (У нас также были бы те же ошибки, если мы попытались запустить новое развертывание без разогрева кеша.)

Есть ли лучший способ справиться с этим? Какой-то способ запускать новый код, не заполняя opcache до тех пор, пока он не исчерпает память (или опустеет сам, потому что у него слишком много файлов), что позволяет избежать вызова opcache_reset() на сайте live? В любом случае мы используем (или пытаемся перейти на) Nginx как наш веб-сервер с PHP-FPM, обрабатывающий запросы PHP.

  • 0
    Как я объяснил в ответе T0xicCode, старые версии op_arrays являются мертвым пространством, пока не будут восстановлены сбросом. Хитрость заключается в том, чтобы иметь достаточно большой кэш, чтобы в нем могли храниться две копии приложения, а затем выполнить сброс во время части смены кладбища в ежедневном цикле загрузки.
Теги:
capistrano
opcache

1 ответ

1

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

Второй вариант - настроить fpm на наличие нескольких пулов и перезапустить их один за другим (они начнут с чистого opcache). Вы в какой-то мере предотвратите отпечаток кеша только один сервер будет иметь чистый кеш в любой момент времени, и приложение будет оставаться в стороне, потому что nginx сможет сбалансировать нагрузку на различные пулы.

Другой вариант - удалить старые версии скрипта, чтобы opcache удалял их из кеша после того, как прошел revalidate_freq, заставляя его загружать новые файлы из файловой системы.

  • 0
    Использование invalidate не помогает в этом сценарии использования, поскольку OPcache не использует модель повторного использования ресурса. Пространство мертвое, пока сброс не будет выполнен или запущен настройками ini.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню