Жизненный цикл запроса в PHP

Я часто слышу, как люди путаются и не могут объяснить, что происходит при вводе адреса сайта в строке браузера. В рунете есть много статей на эту тему, но я постараюсь к каждому из этапов дать дополнительные источники для изучения.
Итак, пользователь ввел в строке браузера адрес сайта www.example.com

1. Для отправки http запроса нам нужен ip адреса назначения. Чтобы понять какой ip соответствует доменному имени, нам нужно сделать запрос на DNS сервер.
Процесс определения DNS в различных ОС примерно один и тот же. Обычно существует список источников DNS информации. По приоритету обычно первым источником является локальное хранилище, в windows это файл hosts. Если записи в локальном хранилище не найдено, то используется следующий источник. Например DNS сервер Google - 8.8.8.8. Сервер DNS для уменьшения нагрузки на сеть кэширует записи DNS. Если же в кэше не оказывается необходимой записи, DNS сервер обращается  к серверу авторитетному для него, и так далее.
Подробнее можно прочитать: 
https://habrahabr.ru/company/1cloud/blog/309018/
https://habrahabr.ru/post/303446/
https://habrahabr.ru/post/137587/

2. Формируется HTTP запрос, упаковывается в сетевой пакет и отправляется на сервер. Http запрос состоит из заголовков и тела запроса, разделенных переносом.
Самый простой http запрос на адрес google.com выглядит так:

GET / HTTP/1.1
Host: google.com

Заголовок Host является обязательным. Подробнее можно прочитать:
https://habrahabr.ru/post/215117/
https://tools.ietf.org/html/rfc2616
3. Сетевой пакет через цепь маршрутизаторов проходит до сервера назначения и сервер решает какое приложение будет заниматься обработкой запроса. Если рассматривать связку nginx и php-fpm, nginx отправляет запрос на php-fpm с параметрами для данного приложения.
Подробнее: https://nginx.ru/ru/docs/http/request_processing.html
4. В случае статики запрос будет обработан на nginx, php-fpm задействован не будет. В php можно добавить заголовки ответа через функцию header, с помощью header_remove удалить их.
5. Полученный от php ответ упаковывается в сетевой пакет и отправляется пользователю
6. Полученный ответ интерпретируется браузером и показывается пользователю. Статика запрашивается отдельными запросами к веб серверу, или же из кэша.


comments powered by Disqus