Мы пытаемся развернуть новый код PHP через Capistrano при запуске Opcache.
Capistrano создает новый каталог развертывания при каждом развертывании, а затем настраивает символическую ссылку, чтобы веб-сервер указывал на новый каталог. Поскольку Opcache кэшируется по реальному пути к файлу, это означает, что недавно развернутая версия сайта полностью кэшируется отдельно от старого.
Проблема, с которой мы сталкиваемся, заключается в том, что Opcache исчерпывает память, потому что каждое новое развертывание приводит к кэшированию всей базы кода, а старый код никогда не выдается. Мы могли бы вызвать opcache_reset()
, но когда кеш сбрасывается, мы кратковременно получаем 500 ошибок, когда отбрасывает тайники. (У нас также были бы те же ошибки, если мы попытались запустить новое развертывание без разогрева кеша.)
Есть ли лучший способ справиться с этим? Какой-то способ запускать новый код, не заполняя opcache до тех пор, пока он не исчерпает память (или опустеет сам, потому что у него слишком много файлов), что позволяет избежать вызова opcache_reset()
на сайте live? В любом случае мы используем (или пытаемся перейти на) Nginx как наш веб-сервер с PHP-FPM, обрабатывающий запросы PHP.
opcache_invalidate
было бы вызвать opcache_invalidate
для каждого из файлов старой версии сайта в конце развертывания. Вы можете предотвратить печать кеша, включив файл после недействительности.
Второй вариант - настроить fpm на наличие нескольких пулов и перезапустить их один за другим (они начнут с чистого opcache). Вы в какой-то мере предотвратите отпечаток кеша только один сервер будет иметь чистый кеш в любой момент времени, и приложение будет оставаться в стороне, потому что nginx сможет сбалансировать нагрузку на различные пулы.
Другой вариант - удалить старые версии скрипта, чтобы opcache удалял их из кеша после того, как прошел revalidate_freq, заставляя его загружать новые файлы из файловой системы.