Когда вы вводите адрес сайта в браузере и нажимаете Enter, запускается цепочка сетевых взаимодействий, длящаяся доли секунды. Чтобы уверенно писать серверный код на PHP, необходимо чётко понимать, что происходит между нажатием клавиши пользователем и появлением готовой страницы на экране: как браузер находит сервер, как формируется HTTP-запрос, как веб-сервер передаёт управление PHP и в каком виде возвращается ответ.
Архитектура «Клиент — Сервер»
Современный веб построен на модели клиент-сервер. В этой модели взаимодействуют две основные стороны:
- Клиент (Client) — программа, запрашивающая ресурсы или данные. В большинстве случаев это веб-браузер (Google Chrome, Firefox, Safari), мобильное приложение или консольная утилита вроде
curl. - Сервер (Server) — компьютер или группа компьютеров в сети, работающих непрерывно, слушающих входящие сетевые подключения и отдающих запрошенные файлы, HTML-страницы или JSON-ответы.
+-------------------+ HTTP-запрос (Request) +-----------------------+
| КЛИЕНТ | ---------------------------------------> | ВЕБ-СЕРВЕР |
| (Браузер, Chrome) | <--------------------------------------- | (Nginx, Apache, PHP) |
+-------------------+ HTTP-ответ (Response) +-----------------------+Клиент всегда является инициатором диалога. Сервер пассивно ожидает запросов, обрабатывает их по правилам протокола HTTP и возвращает результат.
Путь от ввода URL до экрана
Рассмотрим пошагово, что происходит при переходе по адресу https://kurslar.prowid.com/courses:
| Этап | Протокол / Технология | Что происходит |
|---|---|---|
| 1. Разрешение имени (DNS) | DNS (Domain Name System) | Браузер не может связаться с доменным именем напрямую. Он опрашивает DNS-серверы, чтобы узнать IP-адрес сервера (например, 185.199.108.153). |
| 2. Установка соединения | TCP / IP | Браузер открывает сетевой сокет с IP-адресом сервера по порту 80 (для HTTP) или 443 (для HTTPS) через трёхэтапное рукопожатие (TCP Handshake). |
| 3. Защита канала | TLS / HTTPS | При защищённом соединении происходит обмен сертификатами и согласование сессионных ключей шифрования. |
| 4. Отправка запроса | HTTP (1.1 / HTTP/2 / HTTP/3) | Клиент формирует текстовый запрос с методом, путём и заголовками и отправляет его серверу. |
| 5. Обработка на сервере | Веб-сервер + PHP | Сервер анализирует запрос, запускает PHP-скрипт, который генерирует HTML, и формирует ответ. |
| 6. Получение и рендеринг | HTML, CSS, JS движок браузера | Браузер получает байты ответа, разбирает HTML, скачивает CSS, шрифты, скрипты и отрисовывает пиксели. |
💡 Проверить DNS-записи домена в терминале можно утилитами
nslookupилиdig: например,nslookup kurslar.prowid.com.
Анатомия HTTP-запроса и HTTP-ответа
Протокол HTTP (HyperText Transfer Protocol) — текстовый протокол прикладного уровня, работающий по принципу «запрос — ответ».
Структура HTTP-запроса (Request)
Запрос состоит из трёх основных частей:
- Стартовая строка (Request Line): содержит HTTP-метод (
GET,POST,PUT,DELETEи др.), запрашиваемый путь (/courses?cat=backend) и версию протокола (HTTP/1.1). - Заголовки (Headers): пары «ключ: значение», передающие метаданные о клиенте, принимаемых форматах, cookies и кодировках.
- Тело запроса (Body): передаётся при отправке форм или JSON (обычно в методах
POST,PUT,PATCH), вGET-запросах тело отсутствует.
Пример сырого HTTP-запроса:
GET /courses?lang=ru HTTP/1.1
Host: kurslar.prowid.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Cookie: session_id=abc123xyz789
Connection: keep-aliveСтруктура HTTP-ответа (Response)
Ответ сервера зеркален по структуре:
- Строка статуса (Status Line): версия протокола, трёхзначный код ответа и поясняющий текст (например,
HTTP/1.1 200 OKили404 Not Found). - Заголовки ответа: тип содержимого (
Content-Type), длина (Content-Length), установка cookies (Set-Cookie), дата и сервер. - Тело ответа: полезная нагрузка — HTML-разметка, JSON-документ, картинка или файл.
Пример сырого HTTP-ответа:
HTTP/1.1 200 OK
Date: Wed, 30 Sep 2026 07:00:00 GMT
Server: Apache/2.4.58
Content-Type: text/html; charset=UTF-8
Content-Length: 184
Set-Cookie: visited=1; Path=/; HttpOnly
<!DOCTYPE html>
<html lang="ru">
<head><title>Курсы PHP</title></head>
<body>
<h1>Добро пожаловать в курс PHP!</h1>
</body>
</html>Основные группы кодов ответов HTTP
| Диапазон | Категория | Примеры |
|---|---|---|
| 2xx | Успех (Success) | 200 OK, 201 Created, 204 No Content |
| 3xx | Перенаправление (Redirection) | 301 Moved Permanently, 302 Found, 304 Not Modified |
| 4xx | Ошибка клиента (Client Error) | 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found |
| 5xx | Ошибка сервера (Server Error) | 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable |
Статические и динамические страницы: место PHP
Все веб-ресурсы делятся на статические и динамические:
- Статические файлы (
.html,.css,.js,.png,.svg): хранятся на диске сервера в готовом виде. Веб-сервер (например, Nginx) просто считывает их с диска и сразу отдаёт в сеть без каких-либо изменений. - Динамические страницы (
.php): файла с готовым HTML на диске может не существовать вовсе. Вместо этого веб-сервер запускает интерпретатор PHP, передаёт ему данные запроса (параметры URL, данные формы, cookies), PHP выполняет логику (запрашивает базу данных, проверяет права пользователя, собирает шаблоны) и генерирует свежий HTML-код «на лету».
[Браузер]
│
│ 1. HTTP-запрос (GET /profile.php)
▼
[Веб-сервер Nginx / Apache]
│
│ 2. Обнаружил файл .php -> передаёт в PHP
▼
[Интерпретатор PHP]
│
│ 3. Выполняет код, запрашивает MySQL, строит HTML
▼
[Сгенерированный HTML]
│
│ 4. HTTP-ответ с заголовком Content-Type: text/html
▼
[Браузер отрисовывает страницу]Для браузера нет никакой разницы между статическим файлом и результатом работы PHP-скрипта — в обоих случаях он получает стандартный HTTP-ответ с разметкой.
Практика: исследование запросов через cURL и DevTools
Увидеть HTTP-запросы своими глазами можно двумя простыми способами.
Способ 1: Консольная утилита cURL
Ключ -i указывает curl вывести заголовки ответа вместе с телом, а -v (verbose) показывает полный процесс установки соединения и отправки запроса:
curl -i https://httpbin.org/getHTTP/1.1 200 OK
Date: Wed, 30 Sep 2026 07:15:00 GMT
Content-Type: application/json
Content-Length: 255
Connection: keep-alive
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/8.4.0"
},
"origin": "94.20.18.12",
"url": "https://httpbin.org/get"
}Способ 2: Вкладка Network в браузере
- Откройте любой сайт в браузере.
- Нажмите клавишу
F12(илиCtrl+Shift+I/Cmd+Opt+I) и перейдите на вкладку Network (Сеть). - Обновите страницу (
F5илиCtrl+R). - В списке отобразятся все запросы: основной документ, таблицы стилей, скрипты, изображения. Кликнув по первой строке (документу), в правой панели можно детально изучить Headers (заголовки запроса и ответа), Payload (переданные данные) и Response (полученный HTML-код).
⚠️ Важно помнить: PHP работает исключительно на сервере (Server-Side). Пользователь в браузере никогда не видит исходный PHP-код, а получает только конечный результат его работы.