Является ли 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 14

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.

  • Теро