Не очень понимаю, как точно работает fastcgi и phpfpm. Сейчас я себе это представляю так:
fastcgi - что-то вроде сервера, который слушает определенный сокет. Он держит пул процессов (воркеров), которые принимают запросы, обрабатывают, возвращают ответ и ждут дальше запроса.
Вот мне не понятно, что из себя представляют эти процессы. Насколько я знаю php анализируется, транслируется в байткод и потом запускается. Получается, в этих процессах крутится байткод? Или "разогретый" интерпретатор (хотя я не уверен, что понимаю, что значит "разогретый")? Если так, то чем это все отличается от php-cgi + opcache? Выигрыш только за счет того, что процесс каждый раз не запускается?
И чем точно различается встроенный php fastcgi от php fpm? Ну т.е. я понимаю, что он занимается более продвинутым управлением процессов, но чего не хватало обычному fastcgi php, чтобы с ним мог работать тот же nginx?
А что есть всроенный php fastcgi? Возможно речь про встроенный веб сервер?
Вот мне не понятно, что из себя представляют эти процессы. Насколько я знаю php анализируется, транслируется в байткод и потом запускается. Получается, в этих процессах крутится байткод?
Это обычные процессы уровня ОС (полученные через стандартный вызов fork). В их области памяти находится только сам интерпретатор. Мастер процесс принимает входящее соединение и отдает его на обработку соответствующему свободному рабочему процессу. Рабочий процесс поднимает с диска и каждый раз интерпретирует весь код скриптов которые затрагиваются этим запросом. Если специально ни какой кэшер оптокода подключен не был, то это делается на каждый запрос.
Выигрыш только за счет того, что процесс каждый раз не запускается?
В том числе и за счет этого, т.к. fork это достаточно "дорогая" (и следовательно медленная) операция.
Если верить xandeadx.ru/blog/php/866, то "PHP из коробки умеет работать и в FastCGI режиме (с версии 5.3 даже в двух FastCGI режимах). Режим включается флагом при компиляции интерпретатора, флаг зависит от версии PHP", "Nginx умеет работать с FastCGI приложениями из коробки, но именно для PHP дополнительно нужен PHP-FPM".
А с тем, что за процессы крутятся стало понятнее, спасибо.
jereq, ага, теперь понятно. Имеется в виду поддержка на уровне SAPI. Тогда ответ на
И чем точно различается встроенный php fastcgi от php fpm?
будет примерно такой. Это просто разных имплементации FastCGI протокола в PHP интерпретаторе. Первая появилась от основной команды разработчиков. fpm сделал сторонний разработчик. Нигматулин. Сначала в виде патча. Приходилось при выходе каждой новой версии все руками собирать из исходников (у меня до сих пор есть пару инсталяций которые были именно так и собраны). Реализация оказалась довольно удачной и была в ключена в основной код проекта. Сейчас fpm у нас уже из коробки.
fastcgi - что-то вроде сервера, который слушает определенный сокет. Он держит пул процессов (воркеров), которые принимают запросы, обрабатывают, возвращают ответ и ждут дальше запроса.
Вот в этой фразе замени fastcgi на php-fpm и будет правильно. А fastcgi - это технология обработки запроса, по которой каждый воркер крутится в бесконечном цикле, обрабатывая в каждой своей итерации по одному запросу.
Хорошо, с тем, что fastcgi - технология, которая улучшает cgi просто тем, что вместо каждого запуска процесса на каждый запрос, держит процесс в памяти, разобрались.
Что насчет остальных вопросов? Как, например, это в php реализовано? Что из себя представляет этот висящий процесс (воркер) в памяти? И если пхп умеет сам в fastcgi (кстати, как он это умеет?), то почему его не хватает и нужен phpfpm?