Доброго дня всем.
Ну вот смотрите - если мы собираем php, с опцией --with-apxs2, то php сделает
модуль для апача. В таком случае, загружаясь, апач будет подгружать so файл от php.
Это первый вариант.
Другой - fastCGI (апач и php общаються через TCP/IP).
Что-то мне сильно кажется, что вариант mod_pm быстрее будет работать:
рассмотрим что будет происходить на запрос клиента (пусть даже mpm=prefork)
mod_pm:
----------------------------------------
* fork() - свободных уже нет
* обработка запроса, потому что mod_php уже был загружен parent процессом
* выдаем ответ клиенту
fastCGI:
----------------------------------------
* fork() - свободных уже нет
* открываем сокет
* пишем в сокет
* читаем из сокета
* выдаем ответ клиенту
сейчас часто вижу слова fastCGI рядом с nginx, и поэтому решил спросить здесь про
эти особенности (пусть даже не про nginx, хотя мне и это интересно, а прочто про
апач).
заранее спасибо за содержательные ответы.
от себя добавлю, что лайти/фастцыг по производительности в реальных условиях среднего размера веб кластера уделывают апач/мод_пых - апач выедает всю память ноды на 300 одновременных активных коннектах примерно. лайти с фастцыгом спокойно держат пару тысяч на кластере с тем же кол-вом нод/железом.
это конечно лучше всего проверить практически - у меня кстати как раз скоро должна представиться такая возможность :)
думается, что ответ на вопрос зависит ещё и от того, что понимается под "быстрее" - имхо, скорее всего скорость открытия/закрытия сетевых соединений с клиентом веб-сервера будет более-менее одинаковой (не знаю даже что быстрее - передача данных от мод_пхп апачу через пайп, или от фастцыга лайти через файловый дескриптор unix domain soket'a), в то время как общая производительность сервера, т.е. способность к одновременной обработке большого кол-ва соединений в связке фастцыг/лайти явно выше, за счёт меньшего расхода памяти, т.к. порождается гораздо меньше процессов.
В моей практике nginx + php-cgi не блестал стабильностью
под большей нагрузкой. Приходилось запускать в цикле:
while true; do php-cgi -b localhost:9000; sleep 3; done
php5-cgi 5.2.*
странно, получается, когда апач получает запрос на php ресурс, он делает вызов функции из mod_php (которая как so-шка уже подгружена к нему в память), эта функция делает fork(), открывает pipe, и общается с родительским процессом (апачем)
вот хз, не уверен.. похоже что так, и через пайп быстрее, но общая производительность на загруженном кластере снижается из-за постоянного выделения памяти на процессы апача, ведь каждый префорк сьедает порцию памяти, и в итоге вариант с лайти/фастцыгом оказывается оптимальнее на нагрузках больше определённой величины. Но, думается, если сервер не слишком нагружен, apache/mod_php наверное всё таки будет быстрее.