Является ли кеш-код операции APC совместно используемыми пулами/рабочими PHP-FPM?
В Интернете много дискуссий о том, что вызов apc_cache_clear()
в CLI не очищает кеш-коды операций от "веб-процессов PHP", независимо от того, запущены они внутри Apache или FPM (см. How для очистки записей кэша APC?). В качестве предлагаемого решения можно создать простую страницу PHP, которая вызывает apc_cache_clear()
, и вызывать это из CLI. Symfony ApcBundle делает это.
Если apc_cache_clear()
из CLI не освобождает кеш от Apache/FPM, делает ли он между рабочими FPM? Если я вызываю /clear _apc_cache.php через HTTP, он запускается только одним из рабочих процессов FPM. Таким образом, кеш-код операции APC действительно, разделяемый между пулами и рабочими, - и более конкретный: он автоматически очищается от всех работников?
Ответы
Ответ 1
Все рабочие пользователи php-fpm используют один и тот же кеш-код операции как родительский php-fpm-процесс; . Если у вас есть файл /apc _clear_cache.php, и вы вызываете это через HTTP (используя что-то вроде curl), вы очищаете кеш-код операции для всех работников, используя один и тот же основной процесс php-fpm.
Эта статья статьи в блоге содержит очень хорошее объяснение того, как работает apc и как его эффективно очищать во время выпуска.
Ответ 2
Вы можете очистить кеш кода операции через кли без необходимости развернуть файлы на свой веб-сайт, если вы выполняете script напрямую через интерфейс FastCGI.
Я создал этот смысл, который вы можете использовать на своих серверах, чтобы очистить кеш php5-fpm.
Если вы используете сокеты unix:
php clear-apc.php --sock /var/run/php5-fpm.sock
В противном случае:
php clear-apc.php --port=[port]
или опустить по умолчанию 127.0.0.1:9000
Ответ 3
Я только что узнал, что разные пулы также используют один и тот же APC-кеш, по крайней мере, в PHP 5.4 с FPM и в отношении содержимого кэша кода операции.
Вот как я это заметил:
Я создал несколько пулов PHP-FPM, где каждый пул chrooted в каталоге /srv/www/domain.com/.
Основным местом для скриптов PHP является /srv/www/domain.com/docroot/.
Теперь, если я создам файл /srv/www/domain _1.com/docroot/test.php и загружаю script, он показывает, что он должен показывать.
Однако, когда я создаю файл /srv/www/domain _2.com/docroot/test.php, содержимое отображается также под доменом_1.com.
Я думаю, это происходит потому, что APC использует расположение файла в качестве ключа для своего кеша, и в обоих случаях ключ является /docroot/test.php.
Очистка кеша операций может быть ограничена только одним пулом. Я не тестировал это, хотя.
ИЗМЕНИТЬ Очистка кеша кода операции не восстанавливается в один пул приложений, полный кэш APC очищается при вызове apc_cache_clear().
Я также попытался использовать apc.mmap_file_mask, чтобы указать другую маску для каждого пула. Это ничего не изменило, обновления в одном файле пула приложений были замечены в других пулах.
Это поведение наблюдалось при установке apc.stat = 0. Все изменения в файлах контролируются с помощью lsyncd, заставляя перекомпилировать запись в кэше APC.