FastCGI (Fast Common Gateway Interface) — это протокол, предназначенный для увеличения производительности CGI (Common Gateway Interface) за счёт переиспользования процессов при обработке веб-запросов. FastCGI устраняет некоторые из основных недостатков традиционного CGI, такие как низкая производительность из-за необходимости создавать новый процесс для каждого запроса.
FastCGI разработан для предоставления более эффективного и масштабируемого интерфейса между веб-сервером и внешними приложениями (на любом ЯП), которые генерируют контент веб-страниц.
Как работает FastCGI
FastCGI как правило работает в режиме демона, что означает, что процессы запускаются один раз и затем остаются в памяти, готовые обрабатывать приходящие запросы. Этот подход значительно уменьшает нагрузку на систему, так как избавляет от необходимости многократно запускать и инициализировать интерпретатор для каждого отдельного запроса. Так-же можно настроить масштабирование.
Демон — это фоновый процесс, который запускается в фоновом режиме и ожидает выполнения определённых задач или обрабатывает повторяющиеся сервисные запросы.
PHP-FPM
PHP-FPM (PHP FastCGI Process Manager) — это реализация менеджера процессов для PHP, которая использует протокол FastCGI.
Архитектура PHP-FPM
Архитектура PHP-FPM организована с помощью Master Process (Process Manager, PM) и Worker Processes и они играют разные роли.
Master Process (Process Manager)
- Master Process является основным процессом, который запускается при старте PHP-FPM.
- Он контролирует создание, уничтожение и мониторинг Worker Prcesses в соответствии с конфигурацией (например, static, dynamic, ondemand).
- Этот процесс не обрабатывает непосредственно запросы от веб-сервера, а отвечает за управление рабочими процессами .
Worker Processes
- Worker Processes — это дочерние процессы, создаваемые и управляемые Master Process.
- Каждый рабочий процесс включает в себя интерпретатор PHP и фактически обрабатывает PHP-скрипты в ответ на запросы от веб-сервера.
- Эти процессы напрямую получают запрос от сервера минуя Master Process.
- В рабочем процессе PHP-скрипты компилируются и выполняются, а результаты возвращаются веб-серверу через FastCGI интерфейс.
Следует помнить, что при работе PHP в режиме FastCGI в памяти висит сам php интерпретатор, а не какой-то конкретный php-скрипт.
Реальный пример работы PHP-FPM
Представим, что в наше приложение одновременно приходит 50 клиентов. Сначала они обращаются в наш NGINX, который по факту пробрасывает запросы сквозь себя на PHP-FPM (за исключением запросов за статическими ресурсами/файлами), а дальше PHP-FPM пытается обработать все запросы с помощью своих процессов (воркеров).
Допустим у нас запущено 5 воркеров. В таком случае во время одновременного запроса первые 5 клиентов будут обрабатываться сразу, а остальные 45 становятся в очередь и ждут, когда первые 5 закончат обработку. PHP-FPM позволяет задавать настройки в зависимости от ваших потребностей, будь то динамическое увеличение воркеров для того чтобы клиенты не ждали в очереди или экономия ресурсов с целью ускорения обработки запросов со статическим количеством воркеров.