Подписка

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

Для того, чтобы понять что оптимизировать, нужно для начала разобраться как работает Интернет и какие этапы проходит запрос для получения результата.


Итак, этапы обработки запроса:
1. Пользователь вводит запрос в строке браузера, например: http://example.com/mypage.php
2. Если в запросе не указан IP получателя, отправляется запрос на DNS сервер для получения адреса сервера, которому он предназначен.
3. Формируется http запрос, который упаковывается в сетевой пакет и отправляется в сеть.
4. Пакет проходит через цепочку маршрутизаторов, каждый из которых проверяет пункт назначения и перенаправляет кратчайшим путем.
5. Запрос приходит к получателю, в простейшем варианте это один сервер (в более сложном группа), производится распаковка и определение приложения, которое займется его обработкой.
6. И вот наконец данные, которые ввел пользователь, добрались до веб-сервера, который начинает их обработку.
6.1. В зависимости от запроса определяется обработчик, например, статические файлы (изображения, javascript) возвращаются без обработки, тогда как php файлы нужно выполнить на интерпретаторе и только после этого вернуть результат пользователю.
6.2. В нашем случае клиент запросил php файл, поэтому сервер ищет файл mypage.php и передает его php интерпретатору.
6.2. Интерпретатор выполняет код, при необходимости обращаясь к базе данных, файлам, другим сервисам и возвращает результат.
7. Полученный код упаковывается в http ответ, сетевой пакет и отправляется пользователю.
8. Браузер получает ответ от сервера и рендерит (рисует) его, при необходимости подгружая дополнительные ресурсы (изображения, стили и т.д).

Все эти этапы, вместе взятые, запрос должен проходить не дольше чем за секунду.

Мы можем повлиять на обработку запроса только в пунктах:
6 - оптимизацией настроек сервера, кешированием и т.д
8 - кешированием на стороне браузера, оптимизацией css и javascript.

Красивое видео от Google о жизненном цикле email: http://www.google.com/green/storyofsend/desktop/
@kkooler

@kkooler

Занимаюсь разработкой высоконагруженных проектов и распределенных систем на PHP.
В свободное время разрабатываю нано-проекты:

Следить за блогом

RSS канал Twitter