2009-02-28 5 views
20

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

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

ответ

20

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

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

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

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

+4

Согласно другому комментарию, чтобы настроить mod_fastcgi только для запуска одного экземпляра php-cgi (так что сам php-cgi обрабатывает рабочих и, следовательно, общий кеш), это «FastCgiConfig -maxClassProcesses 1» в httpd.conf. См. Также http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html. – mjs

+0

Ошибка # 57825 была закрыта. Поддерживает ли PHP это сейчас? – mgutt

+4

FPM поддерживает его и устарел от большинства решений на основе fcgid/fastcgi. У APC по-прежнему возникают проблемы с блокировками (конфликтами, взаимоблокировками), когда вы делитесь ими между работниками в большом пуле, но он работает очень хорошо (и * очень хорошо подходит для кэширования файлов/операций), а FPM имеет встроенные функции безопасности (segfault обнаружение), когда APC действительно наполняется.(Хотя, это не помогает для тупиков.) –

0

Кэш должен быть разделен между процессами. Вы должны увидеть одно и то же значение для файла 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 должен быть одним из значений, которые они позволяют. Поэтому, если вам не хватает одного из этих Xs, вы не знаете, что получите.

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

+0

Честно говоря, я не думаю, что это действительно работает для вас. Если вы обновляете страницы, вас обычно будет обслуживать один и тот же рабочий php-cgi по какой-либо причине (возможно, KeepAlive?), Особенно (и я не говорю, что это так), если ваш сервер не находится под целой кучей нагрузки. –

10

Хотя это не идеальный метод, предложенный Domster, является лучшим. Я делал это в течение короткого времени на некоторых сайтах с низким объемом без ошибок. Вчера вечером я написал подробное объяснение по поводу how to set up mod_fastcgi with a shared opcode cache.

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

+0

понравилась ваша статья - нашел ее выше этой темы в google! – benlumley

+0

Отличный ответ! Это также помогло мне решить мою проблему параллелизма с помощью 'mod_fcgid'! – vdboor

+0

отличная статья! см. также http://whorka.github.com/blog/2012/02/08/apache-mod_fastcgi-suexec-php-apc-rhel.html –