Встроенный веб‑сервер PHP: как запустить, настроить роутинг и отладку (пошаговое руководство)
Встроенный веб‑сервер PHP — это самый быстрый способ запустить проект локально без лишней конфигурации. Команда php -S поднимает сервер за секунду, а простой роутер на PHP позволяет эмулировать ЧПУ, API и даже CORS для фронтенда. Разберём всё пошагово: от базового запуска до практичного мини‑роутинга.
Когда использовать встроенный сервер PHP
Важно: встроенный сервер предназначен только для разработки, не для продакшена.
Проверка версии и первый запуск
Убедитесь, что PHP установлен и доступен в терминале:
php -v
Запустим простой сервер из текущей папки (докрут — текущий каталог):
php -S localhost:8000
Создайте файл index.php в корне и добавьте:
<?php
echo 'Привет из встроенного сервера PHP!';
Откройте http://localhost:8000 — вы увидите сообщение.
Запуск с отдельной папкой public и роутером
Рекомендуем хранить публичные файлы в каталоге public, а логику — вне веб‑докрута. Структура:
project/
public/
index.php
assets/style.css
router.php
src/...
Запуск с указанием докрута и роутера:
php -S localhost:8000 -t public router.php
Роутер перехватывает запросы, отдаёт статические файлы напрямую, а всё остальное — пробрасывает в index.php.
router.php
<?php
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$full = __DIR__ . '/public' . $path;
// Если запрашивают существующий файл (CSS, JS, изображения) — отдать его сервером напрямую
if (is_file($full)) {
return false; // Встроенный сервер сам отдаст файл
}
// Иначе — передать управление front controller-у
require __DIR__ . '/public/index.php';
public/index.php: мини‑роутинг без фреймворков
<?php
declare(strict_types=1);
// Включим подробные ошибки для разработки
ini_set('display_errors', '1');
error_reporting(E_ALL);
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$method = $_SERVER['REQUEST_METHOD'];
// Простая зона API с CORS (для запросов с фронтенда)
if (str_starts_with($uri, '/api/')) {
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
if ($method === 'OPTIONS') {
exit; // preflight ответ
}
}
if ($uri === '/' && $method === 'GET') {
echo '<h1>Главная</h1><p>Это мини‑роутер на встроенном сервере PHP.</p>';
exit;
}
if ($uri === '/api/ping' && $method === 'GET') {
header('Content-Type: application/json; charset=utf-8');
echo json_encode(['pong' => true]);
exit;
}
if ($uri === '/users' && $method === 'GET') {
$users = [
['id' => 1, 'name' => 'Алиса'],
['id' => 2, 'name' => 'Боб'],
];
header('Content-Type: application/json; charset=utf-8');
echo json_encode($users, JSON_UNESCAPED_UNICODE);
exit;
}
http_response_code(404);
echo '404 Not Found';
Теперь запросы к /assets/style.css отдаются напрямую, а URL вроде /api/ping и /users обрабатываются вашим PHP‑кодом.
Полезные флаги и сценарии запуска
php -S 127.0.0.1:8000 -t public router.php
php -S 0.0.0.0:8000 -t public router.php
php -S localhost:8000 -t public router.php
Отладка и ошибки
Для разработки включайте вывод ошибок и уровень E_ALL (как в примере выше). Для глубокой отладки можно подключить Xdebug, но чаще достаточно логов и var_dump().
Частые проблемы и решения
php -S localhost:8001. На macOS/Linux проверьте: lsof -i :8000 и завершите процесс.ini_set('display_errors','1'); error_reporting(E_ALL);false для файлов и путь к public совпадает.Зачем нужен роутер, если есть index.php?
Без роутера встроенный сервер попытается найти физический файл по запрошенному пути. Роутер перехватывает запросы к «несуществующим» файлам (например, /users/42) и перенаправляет их в ваш front controller для дальнейшей логики, имитируя поведение веб‑сервера с mod_rewrite.
Лучшие практики
JSON_UNESCAPED_UNICODE для читаемости на русскомЧто дальше изучать
Если хотите системно прокачать PHP (включая работу с MySQL, архитектурой и практикой), посмотрите программу курса и начните обучение: Прокачать навыки на курсе «PHP и MySQL с Нуля до Гуру 3.0».
Вывод
Встроенный веб‑сервер PHP — идеальный инструмент для быстрого старта. С одной командой php -S и коротким router.php вы получаете удобную среду для локальной разработки: статика, ЧПУ‑роутинг, JSON‑API и CORS — всё работает из коробки и без сложной настройки веб‑сервера.




