Расскажи про жизненный цикл HTTP-запроса к PHP-сайту.

Ответ

Когда пользователь открывает страницу, запрос проходит следующие этапы:

  1. Клиентская сторона: Браузер формирует HTTP-запрос (GET, POST и т.д.) и отправляет его на IP-адрес сервера через DNS.
  2. Веб-сервер (Nginx/Apache): Сервер принимает запрос на 80/443 порту. Nginx, который я часто использую, проверяет конфигурацию и определяет, что запрос к файлам .php должен быть передан обработчику.
  3. PHP-FPM: Nginx передает запрос процессу PHP-FPM (FastCGI Process Manager) через сокет или TCP. PHP-FPM выбирает свободный worker-процесс для обработки.
  4. Интерпретатор PHP: Worker загружает скрипт (например, index.php — единая точка входа фреймворка). Запускается автозагрузчик Composer, инициализируется ядро приложения (Laravel/Symfony), которое:
    • Парсит запрос (URL, заголовки, тело).
    • Находит соответствующий маршрут (роут).
    • Запускает посредников (middleware) для аутентификации, проверки CSRF-токена и т.д.
    • Вызывает контроллер или обработчик.
  5. Выполнение бизнес-логики: Контроллер взаимодействует с моделями, сервисами, делает запросы к базе данных через ORM (Eloquent/Doctrine).
  6. Формирование ответа: Приложение создает ответ — шаблон Blade/Twig, JSON-массив и т.д.
  7. Отправка ответа: Ответ проходит обратно через цепочку посредников, PHP-FPM возвращает его веб-серверу, который добавляет необходимые HTTP-заголовки и отправляет данные браузеру.

Важно: На высоконагруженных проектах мы кешируем ответ целиком (Nginx cache) или его части (Redis для сессий, данных), чтобы минимизировать выполнение полного цикла.

Ответ 18+ 🔞

А, ну слушай, вот эта вся магия, когда ты в браузере ссылку тыкаешь, а тебе сайт вываливается — она же не просто так происходит. Там под капотом, ёпта, целая эпопея разворачивается, овердохуища процессов. Сейчас на пальцах объясню, как оно там всё вертится, а то некоторые думают, что интернет — это волшебная коробочка.

Ну вот, представим, ты кликнул. Сначала твой браузер, эта мартышлюшка, начинает суетиться. Он собирает HTTP-запрос — это как письмо с адресом «хочу вот эту страницу». Письмо он шлёт не по имени, а по IP-адресу, который узнаёт через DNS — этакую телефонную книжку для интернета. Всё, письмо в пути.

Дальше оно прилетает на сервак. Там его встречает, допустим, Nginx — наш главный швейцар и распорядитель. Он стоит на 80-м или 443-м порту, как батя на вахте. Смотрит он на конфиг и видит: «Ага, запрос к файлу .php. Значит, это не статичная картинка, которую можно сразу отдать, а какая-то хитрая жопа, которую надо исполнять». И он не сам этим занимается, нет. Он аккуратно передаёт эту задачку специальному обработчику.

А обработчик этот — PHP-FPM. Представь себе цех, где сидят рабочие (worker-процессы) и ждут заданий. Nginx через сокет стучится: «Эй, есть работа!». FPM смотрит, кто свободен, и пихает задачу этому свободному воркеру. Вот этот самый воркер и есть тот самый парень, который всё и делает.

Он берёт наш скрипт, обычно это index.php — единая точка входа, типа парадной двери в приложение. И тут начинается самое интересное. Запускается автозагрузчик Composer (ну, если проект нормальный, а не как будто на дворе 2002-й год), инициализируется ядро фреймворка — Laravel там или Symfony. Это ядро — оно как главный диспетчер на стройке.

Оно разбирает присланное письмо-запрос: смотрит, какой URL, какие заголовки, что в теле. Потом лезет в список маршрутов и ищет: «Ага, вот этот путь соответствует вот этому контроллеру и методу». Но прежде чем пустить в самую святая святых — бизнес-логику, — запрос прогоняют через посредников (middleware). Это как несколько КПП. Один проверяет, авторизован ли ты (не злоумышленник ли, пидарас шерстяной), другой глядит CSRF-токен (чтоб не поддельные запросы слали), третий ещё что-то. Если на каком-то КПП задержали — всё, приехали, ответ с ошибкой сразу назад.

Если всё ок, запрос наконец доходит до контроллера. А контроллер — это уже мозги операции. Он начинает дёргать модели, сервисы, лезть в базу данных через ORM (типа Eloquent), чтобы вытащить нужные данные. Вот тут-то и выполняется вся бизнес-логика, ради которой всё и затевалось.

После того как всё посчитали, нашли, приготовили, надо ответ сформировать. Приложение рендерит шаблон (Blade или Twig), подставляя в него данные, или просто готовит JSON-массив для API. Готовый ответ — это уже почти готовое письмо обратно пользователю.

Но и его просто так не выпустят! Он обратно проходит через цепочку посредников, только теперь в обратном порядке — на всякий случай. Потом PHP-FPM-воркер отдаёт результат швейцару Nginx, тот добавляет нужные HTTP-заголовки (типа куки, кэширования) и, наконец, отправляет эту пачку данных твоему браузеру. Браузер получает, рисует — и вуаля, ты видишь страницу.

И знаешь, что самое главное? На больших проектах, где трафик — просто пиздец, этот полный цикл на каждый чих не гоняют. Это же долго, ресурсов жрёт дохуя. Поэтому всё кешируют, где только можно. Часто Nginx может отдать страницу целиком из своего кэша, даже не беспокоя PHP. Данные сессии или частозапрашиваемые данные — в Redis. Иначе сервак просто ляжет и будет лежать, как довольный. Вот так, чувак, грубо говоря, оно и работает. Не магия, а чётко настроенный конвейер, просто снаружи не видно.