Когда вы вводите адрес сайта в браузере и нажимаете Enter, запускается цепочка сетевых взаимодействий, длящаяся доли секунды. Чтобы уверенно писать серверный код на PHP, необходимо чётко понимать, что происходит между нажатием клавиши пользователем и появлением готовой страницы на экране: как браузер находит сервер, как формируется HTTP-запрос, как веб-сервер передаёт управление PHP и в каком виде возвращается ответ.

Архитектура «Клиент — Сервер»

Современный веб построен на модели клиент-сервер. В этой модели взаимодействуют две основные стороны:

  1. Клиент (Client) — программа, запрашивающая ресурсы или данные. В большинстве случаев это веб-браузер (Google Chrome, Firefox, Safari), мобильное приложение или консольная утилита вроде curl.
  2. Сервер (Server) — компьютер или группа компьютеров в сети, работающих непрерывно, слушающих входящие сетевые подключения и отдающих запрошенные файлы, HTML-страницы или JSON-ответы.
text
+-------------------+           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)

Запрос состоит из трёх основных частей:

  1. Стартовая строка (Request Line): содержит HTTP-метод (GET, POST, PUT, DELETE и др.), запрашиваемый путь (/courses?cat=backend) и версию протокола (HTTP/1.1).
  2. Заголовки (Headers): пары «ключ: значение», передающие метаданные о клиенте, принимаемых форматах, cookies и кодировках.
  3. Тело запроса (Body): передаётся при отправке форм или JSON (обычно в методах POST, PUT, PATCH), в GET-запросах тело отсутствует.

Пример сырого HTTP-запроса:

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)

Ответ сервера зеркален по структуре:

  1. Строка статуса (Status Line): версия протокола, трёхзначный код ответа и поясняющий текст (например, HTTP/1.1 200 OK или 404 Not Found).
  2. Заголовки ответа: тип содержимого (Content-Type), длина (Content-Length), установка cookies (Set-Cookie), дата и сервер.
  3. Тело ответа: полезная нагрузка — HTML-разметка, JSON-документ, картинка или файл.

Пример сырого HTTP-ответа:

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-код «на лету».
text
[Браузер]
   │
   │ 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) показывает полный процесс установки соединения и отправки запроса:

bash
curl -i https://httpbin.org/get
text
HTTP/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 в браузере

  1. Откройте любой сайт в браузере.
  2. Нажмите клавишу F12 (или Ctrl+Shift+I / Cmd+Opt+I) и перейдите на вкладку Network (Сеть).
  3. Обновите страницу (F5 или Ctrl+R).
  4. В списке отобразятся все запросы: основной документ, таблицы стилей, скрипты, изображения. Кликнув по первой строке (документу), в правой панели можно детально изучить Headers (заголовки запроса и ответа), Payload (переданные данные) и Response (полученный HTML-код).

⚠️ Важно помнить: PHP работает исключительно на сервере (Server-Side). Пользователь в браузере никогда не видит исходный PHP-код, а получает только конечный результат его работы.