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

Запрос и ответ на простом примере

Откройте public/index.php и посмотрите на адрес. Для пути /books сервер передаёт приложению URI и HTTP-метод. В PHP это можно прочитать так:

<?php
declare(strict_types=1);

$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
$uri = $_SERVER['REQUEST_URI'] ?? '/';
$path = parse_url($uri, PHP_URL_PATH) ?? '/';

if ($method === 'GET' && $path === '/books') {
    http_response_code(200);
    header('Content-Type: text/html; charset=utf-8');
    echo '<h1>Мои книги</h1>';
    exit;
}

http_response_code(404);
header('Content-Type: text/plain; charset=utf-8');
echo 'Страница не найдена';

$_SERVER содержит сведения о текущем запросе. http_response_code() задаёт статус, а header() — заголовок ответа. Заголовки нужно отправить до любого вывода, иначе PHP может уже начать передавать тело ответа.

GET и POST решают разные задачи

GET обычно запрашивает страницу или данные; его параметры видны в адресе после ?. POST отправляет содержимое формы или создаёт/изменяет ресурс. Сам метод не проверяет права пользователя и не защищает от подделки запроса — это обязанности приложения.

Данные запроса нельзя считать доверенными. Путь, query-параметр или заголовок может быть произвольным. Проверяйте их формат, прежде чем выбирать действие или обращаться к хранилищу.

Запускаем встроенный сервер с маршрутизатором

Для локальной разработки запустите:

php -S 127.0.0.1:8000 -t public

Если PHP не находит маршрут для произвольного URL, встроенный сервер обычно ищет соответствующий файл. В следующей части мы сделаем единую точку входа и разберём адреса явно. Важно: встроенный сервер только для локальной разработки; официальный PHP не рекомендует открывать его в публичную сеть.

Сначала статус, затем тело

Для несуществующей страницы возвращайте статус 404, а не обычный 200 с текстом «не найдено». Для некорректных данных позже используем 400 или возвращаем форму с подсказкой. Код состояния сообщает браузеру, поисковым системам и другим клиентам, чем закончился запрос.

Проверка

  1. Откройте /books и проверьте, что ответ содержит страницу каталога.
  2. Откройте /unknown и убедитесь, что приложение возвращает 404.
  3. Посмотрите ответ во вкладке Network браузера: там видны статус и заголовки.

Теперь у приложения есть две разные задачи: определить маршрут запроса и отобразить HTML. Разнесём их по файлам и добавим шаблон списка.

Часть 11 из 16.

← Часть 10: Сохраняем данные PHP в JSON: первое хранилище каталога · Часть 12: Маршрутизация и шаблоны PHP: собираем веб-страницу →

Документация