Как PHP работает в современной веб-разработке

Какие способы существуют для использования языка PHP? Одно из ключевых понятий, которое нужно понимать: если вы установили веб-сервер Nginx или Apache, это автоматически не означает, что у вас будет поддержка языка программирования PHP.

Веб-серверы, такие как Nginx или Apache, хорошо справляются с приёмом HTTP-запросов и отдачей статических файлов — HTML, CSS, изображений и так далее. Но они не умеют напрямую исполнять PHP-код. Им нужен посредник. Существует несколько способов, как можно этого посредника предоставить.

Одним из таких посредников является PHP-FPM — специализированный менеджер процессов FastCGI Process Manager. Эти процессы умеют обрабатывать язык программирования PHP, принимают запросы от веб-сервера и эффективно распределяют их между доступными PHP-процессами. В случае использования PHP-FPM мы имеем дело с системными процессами, которых будет достаточно много.

Каждый из этих процессов по-особому обрабатывает наши задачи и PHP-скрипты. PHP-FPM — это как шеф-повар или менеджер кухни. Он получает заказ от администратора и решает, какой из поваров (PHP-процессов) сейчас свободен, чтобы приготовить блюдо.

Ключевые функции PHP-FPM:

  • запуск и остановка PHP-процессов
  • управление количеством процессов и распределение нагрузки
  • контроль памяти и стабильности

Жизненный цикл запроса выглядит следующим образом: пользователь делает запрос к веб-серверу (Apache или Nginx). Веб-сервер отправляет его менеджеру процессов PHP-FPM. Nginx передаёт запрос через сокет. PHP-FPM выбирает свободный worker — PHP-процесс, который будет обрабатывать скрипт.

PHP-worker выдаёт результат, который возвращает веб-серверу, а веб-сервер уже отдаёт результат пользователю. PHP-процессы работают независимо друг от друга. Это так называемые воркеры-исполнители, которые интерпретируют PHP-код и преобразуют его в конечный результат — например, HTML-разметку.

Устаревшие способы обработки PHP

PHP-FPM существовал не всегда. Этот подход развивался постепенно и появился уже в современной разработке. До этого были другие варианты запуска PHP на веб-сервере. Преимущества PHP-FPM становятся очевидными, когда мы разберём эти устаревшие способы.

Первый способ — CGI-подход. Common Gateway Interface был одним из стандартов для обработки PHP. Для каждого входящего запроса веб-сервер запускал совершенно новый отдельный процесс PHP. Это было очень медленно и неэффективно — запуск процесса являлся дорогостоящей операцией. Сейчас этот способ обработки PHP не используется.

Второй способ — тесная интеграция с веб-сервером Apache через модуль mod_php. Этот способ работает только с веб-сервером Apache. Модуль содержит интерпретатор, который обрабатывает PHP-запросы. Здесь есть и плюсы, и минусы.

Плюс — простота настройки: достаточно установить модуль для Apache, который, как правило, установлен по умолчанию. Минусы — высокий расход памяти: каждый даже самый маленький процесс Apache несёт в себе весь интерпретатор PHP, даже если обслуживает статический файл. Также отсутствует гибкость — работает только с Apache, несовместим с Nginx и другими веб-серверами.

Можно провести аналогию: каждый официант в зале у нас одновременно профессиональный повар. Это избыточно дорого и расходует память. В современных проектах такой способ лучше не использовать.

Ещё один большой минус: если мы решим перейти на другую версию PHP, а несколько проектов завязаны на веб-сервер Apache, мы не сможем разделить версии PHP для каждого проекта отдельно. Придётся обновлять веб-сервер и всё окружение целиком.

PHP-FPM и PHP CLI

Современный подход PHP-FPM избавляет от всех этих минусов. Он работает с любым веб-сервером — Nginx, Apache или другим. Мы получаем менеджер процессов и независимость от версии PHP. Очень легко обновлять версии PHP и поддерживать сразу несколько проектов с разными версиями.

PHP-FPM даёт решающие преимущества: производительность, стабильность, эффективное управление памятью и ресурсами.

Кроме этих методов существует ещё один способ использовать PHP — это PHP CLI, инструмент для командной строки. Его не следует использовать как альтернативу PHP-FPM для веба. Его назначение:

  • выполнение скриптов из командной строки
  • задачи по расписанию (cron)
  • обработчик очередей
  • консольные команды фреймворков

PHP CLI предназначен для фоновых и административных задач, а не для обработки HTTP-запросов в реальном времени.

Стандарт де-факто для современной веб-разработки — PHP-FPM. Его архитектура решает фундаментальные проблемы производительности, масштабируемости и управления ресурсами, с которыми сталкивались предыдущие подходы.