Как разделить кэш APC между несколькими процессами PHP при работе под FastCGI? - PullRequest
20 голосов
/ 28 февраля 2009

В настоящее время я использую несколько копий PHP / FastCGI с включенным APC (под Apache + mod_fastcgi, если это имеет значение). Могу ли я разделить кеш между процессами? Как я могу проверить, если он уже открыт? (Я думаю, что настройка apc.mmap_file_mask ini может быть задействована, но я не знаю, как ее использовать.)

(Одна из причин, по которой я думаю, что не в данный момент используется совместно, заключается в том, что apc.mmap_file_mask, как сообщает веб-интерфейс apc.php, перезагружается между примерно 3 различными значениями при перезагрузке.)

Ответы [ 3 ]

20 голосов
/ 17 июня 2009

APC не в настоящее время разделяет свой кеш между несколькими работниками php-cgi, работающими под управлением fastcgi или fcgid. См. запрос этой функции для получения подробной информации: "это поведение является намеченным на данный момент".

Один из способов - разрешить PHP управлять своими работниками. Вы можете сделать это, используя переменную окружения PHP_FCGI_CHILDREN в вашем скрипте-оболочке (для этого есть множество примеров во всем Интернете). Вы также должны остановить fastcgi / fcgid от запуска более чем одного PHP-процесса, если вы хотите использовать этот метод.

Недостатком PHP_FCGI_CHILDREN является то, что управление рабочими не так хорошо, как в fcgid / fastcgi.

Итак, мы здесь. APC в среде fcgid / fastcgi означает предоставление каждому работнику PHP своего собственного кэша или отключение процесса fcgid / fastcgi в пользу встроенного управления PHP. Будем надеяться, что это изменится в будущем.

10 голосов
/ 07 июля 2009

Хотя метод, предложенный Домстером, не идеален, он лучший. Я делал это в течение короткого времени на некоторых сайтах с небольшим объемом без ошибок. Я написал подробное объяснение , как настроить mod_fastcgi с общим кэшем кода операции прошлой ночью.

Мне показалось очень важным использовать mod_fastcgi, а не более новый mod_fcgid, потому что mod_fcgid будет отправлять только один запрос за один раз процессу PHP независимо от того, сколько дочерних элементов PHP породило через PHP_FCGI_CHILDREN.

0 голосов
/ 28 февраля 2009

Кэш должен быть разделен между процессами. Вы должны увидеть одинаковое значение для файла mmap между вызовами phpinfo () и apc.php. Он работает для меня с предлагаемыми настройками конфигурации APC по умолчанию:

extension="apc.so"
apc.enabled=1
apc.shm_segments=1
apc.shm_size=128
apc.ttl=7200
apc.user_ttl=7200
apc.num_files_hint=1024
apc.mmap_file_mask="/tmp/apc.XXXXXX"
apc.enable_cli=1

Возможно, вы захотите опубликовать свои настройки. Я видел предупреждения о том, что mmap_file_mask должно быть точно одним из допустимых значений. Так что, если вам не хватает одного из этих крестиков, невозможно сказать, что вы получите.

Возможно, это относится к вашей конфигурации fastcgi + apache.

...