Является ли APC opcode cache общим для пулов PHP-FPM / workers?
Интернет имеет много дискуссий о том, что вызов apc_cache_clear()
в CLI не очищает кэши opcode от" веб " PHP-процессов, независимо от того, выполняются ли они внутри Apache или FPM (см. Как очистить записи кэша APC?). В качестве предлагаемого решения можно создать простую страницу PHP, которая вызывает apc_cache_clear()
, и вызвать ее из CLI. ApcBundle Symfony делает это.
Если apc_cache_clear()
из CLI не опустошает кэш из Apache/FPM, это происходит между работниками FPM? Если я позвоню ... /clear_apc_cache.php через HTTP, он запускается только одним из рабочих процессов FPM. Итак, действительно ли кэш опкодов APC является общим для пулов и рабочих - и более конкретно: очищается ли он от всех рабочих автоматически?
3 ответа:
Все работники php-fpm используют один и тот же кэш опкодов, что и родительский процесс php-fpm; Источник. Если у вас есть /apc_clear_cache.php-файл, и вы вызываете его по HTTP (используя что-то вроде curl), вы очистите кэш кода операции для всех работников, использующих один и тот же главный процесс php-fpm.
В этой статье блога есть очень хорошее объяснение того, как работает apc и как эффективно очистить его во время выпуска.
Вы можете очистить кэш кодов операций через cli без необходимости развертывания файлов на вашем веб-сайте, если вы выполняете сценарий через интерфейс FastCGI напрямую.
Я создал Этот gist, который вы можете использовать на своих серверах для очистки кэша php5-fpm.
Если вы используете сокеты unix:
php clear-apc.php --sock /var/run/php5-fpm.sock
В противном случае:
php clear-apc.php --port=[port]
Или опустить по умолчанию
127.0.0.1:9000
Я только что обнаружил, что разные пулы также используют один и тот же кэш APC, по крайней мере, в PHP 5.4 с FPM и в том, что касается содержимого кэша opcode.
Вот как я это заметил:
Я настроил несколько пулов PHP-FPM,где каждый пул находится в корневом каталоге /srv/www/domain.com/.
Основное расположение PHP-скриптов - это /srv / www / domain. com / docroot/.
Теперь, если я создам файл /srv/www/domain_1.com/docroot/test.php, и загрузить скрипт, он показывает что он должен показать.
Однако, когда я создаю файл /srv/www/domain_2.com/docroot/test.php, содержимое также отображается под domain_1.com.
Я думаю, что это происходит потому, что APC использует расположение файла в качестве ключа для своего кэша, и в обоих случаях ключом является /docroot/test.РНР.
Очистка кэша кодов операций может быть ограничена только одним пулом. Но я еще не проверял это.
EDIT Очистка кэша кодов операций не выполняется повторно в одном пуле приложений. полный кэш APC очищается при вызове функции apc_cache_clear ().
Я также пытался использовать apc.mmap_file_mask для указания другой маски для каждого пула. Это ничего не изменило, обновления в одном пуле приложений были замечены в других пулах.
Такое поведение наблюдалось и с apc.stat=0 настройка. Все изменения в файлах отслеживаются с помощью lsyncd, заставляя перекомпилировать запись в кэше APC.
- Теро