PHP-FPM (FastCGI Process Manager) — менеджер процессов PHP, работающий как отдельный демон. Веб-сервер (Nginx, Apache) общается с PHP-FPM через FastCGI-протокол (обычно через Unix-сокет или TCP-порт 9000). PHP-FPM управляет пулом PHP-воркеров, перезапускает зависшие процессы и контролирует потребление памяти.
Архитектура
PHP-FPM запускает master-процесс и несколько worker-процессов (согласно настройке пула). Каждый воркер — отдельный PHP-процесс с полным интерпретатором. Master следит за воркерами: перезапускает упавшие, добавляет новые при росте нагрузки, уничтожает лишние в простое.
Режимы управления воркерами (pm в php-fpm.conf):
static— фиксированное число процессов. Предсказуемое потребление памяти.dynamic— от min до max воркеров, создаются и уничтожаются по нагрузке.ondemand— воркеры создаются только под запросы, уничтожаются через idle-timeout. Экономит RAM на слабых VPS.
Конфигурация Nginx + PHP-FPM
Пример конфига Nginx для передачи PHP-запросов:
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
История
PHP-FPM разработан Андрей Нигматулиным в 2004 году как сторонний патч. С PHP 5.3.3 (2010) PHP-FPM вошёл в основной дистрибутив PHP как --enable-fpm. До PHP-FPM стандартным способом запуска PHP был mod_php в Apache — модуль, запускающий PHP в процессе Apache. Переход на Nginx + PHP-FPM произошёл в 2010-х годах с ростом популярности Nginx.
Связь с хостингом
PHP-FPM — стандарт для продакшн-серверов с Nginx. На виртуальном хостинге PHP обычно работает через mod_php или как CGI. На VDS/выделенных серверах рекомендуется PHP-FPM с пулами под каждый сайт: изоляция воркеров предотвращает ситуацию, когда один сайт потребляет всю RAM. Лимиты через pm.max_children и request_terminate_timeout защищают от зависших скриптов.
PHP-FPM vs mod_php
mod_php встраивает PHP в каждый процесс Apache: если Apache создаёт 100 worker-процессов, каждый из них несёт PHP в памяти (~30--50 МБ). Итого -- 3--5 ГБ RAM только на PHP-интерпретатор. PHP-FPM запускает отдельный пул PHP-воркеров, независимый от веб-сервера. С Nginx + PHP-FPM: Nginx работает асинхронно и обрабатывает тысячи соединений в нескольких процессах, PHP-FPM держит 20--50 воркеров в пуле. Суммарное потребление RAM в 5--10 раз ниже. PHP-FPM поддерживает несколько пулов с разными настройками для разных сайтов: site1 с PHP 8.1 и 256 МБ памяти, site2 с PHP 8.3 и 512 МБ.
Настройка PHP-FPM
Ключевые параметры пула: pm.max_children (максимум воркеров), pm.start_servers (стартовое число), pm.min_spare_servers/pm.max_spare_servers. Режим pm: static (фиксированное число), dynamic (авторегулирование), ondemand (воркеры создаются по запросу). Для production рекомендуется dynamic. Slow log в PHP-FPM записывает запросы медленнее порога: request_slowlog_timeout = 5s -- незаменимо для диагностики. Хостинг PHP на современных серверах использует PHP-FPM как стандарт. OPcache совместно с PHP-FPM кэширует скомпилированный PHP-байткод.
История PHP-FPM
PHP-FPM создал Андрей Нигматулин как патч к PHP в 2004 году. В ядро PHP включён в версии 5.3.3 (2010). До PHP-FPM альтернативой mod_php был FastCGI (spawn-fcgi), менее надёжный. Сейчас PHP-FPM -- стандарт для любого production-деплоя PHP. В 2023 году PHP-FPM 8.3 добавил улучшенную диагностику и новые метрики мониторинга.