Локальный PHP сервер: команда php -S и ее возможности
Основные способы запуска встроенного PHP сервера
Наиболее эффективное решение для разработки
Встроенный веб-сервер PHP запускается командой php -S localhost:8000. Этот сервер предназначен только для локальной разработки и не подходит для продакшн-окружения. По умолчанию он обслуживает файлы из текущей директории, используя встроенный обработчик для скриптов PHP. Простейший запуск:
php -S localhost:8000Php localhost 8000 (запуск php встроенного сервера на порту 8000)
После выполнения команды сервер слушает порт 8000. Откройте браузер по адресу http://localhost:8000. Все запросы обрабатываются сервером, PHP-файлы исполняются, остальные отдаются как статика.
Типичная ошибка: Порт занят. Если порт 8000 уже используется, появится сообщение Address already in use. Решение: указать другой порт, например php -S localhost:8080, или завершить процесс, занимающий порт.
Как указать корневую директорию сервера?
Используйте опцию -t (document root). Например, для папки public:
php -S localhost:8000 -t publicPhp s localhost (запуск php сервера с localhost)
Теперь корень сервера - директория public. Все запросы к http://localhost:8000/ обрабатываются относительно этой папки. Это полезно для проектов с точкой входа (index.php в public).
Как настроить собственный Router (front controller)?
При разработке SPA или фреймворков требуется, чтобы все запросы направлялись на один PHP-файл (например, index.php). Для этого передайте имя PHP-файла как аргумент:
php -S localhost:8000 -t public router.phpгде php код (где находится php код)
Файл router.php должен содержать логику маршрутизации, например:
<?php
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if ($uri === '/' || file_exists(__DIR__ . '/public' . $uri)) {
return false; // отдать статический файл
}
$_GET['url'] = substr($uri, 1);
require __DIR__ . '/public/index.php';где лог php (где находится лог php)
Если скрипт возвращает false, сервер отдаёт статический файл как обычно; иначе выполняется указанный скрипт.
Как разрешить доступ с других устройств в локальной сети?
По умолчанию сервер слушает только localhost (127.0.0.1). Чтобы принимать соединения с любого сетевого интерфейса, укажите 0.0.0.0:
php -S 0.0.0.0:8000где создать php (где создать php файл)
Теперь сервер доступен по IP-адресу вашего компьютера в локальной сети. Например, http://192.168.1.100:8000. Это удобно для тестирования на мобильных устройствах или других ПК.
Как запустить несколько экземпляров сервера на разных портах?
Просто откройте несколько терминалов и запустите сервер на разных портах, например:
php -S localhost:8000
php -S localhost:8001Php mysql поддержка (поддержка mysql в php)
Каждый экземпляр работает независимо со своим корневым каталогом (по умолчанию текущий). Для разных проектов можно указывать разные корневые папки через -t.
Как задать дополнительные настройки PHP через php.ini?
Используйте опцию -c для указания пути к ini-файлу:
php -S localhost:8000 -c /path/to/custom.iniPhp без сервера (запуск php без веб-сервера (cli))
В ini-файле можно задать, например, увеличенный лимит памяти или включить отображение ошибок:
memory_limit = 256M
display_errors = On
Если опция -c не указана, сервер использует стандартный загруженный php.ini.
Типичные проблемы и их решения
Ошибка: 'php' не является внутренней или внешней командой - PHP не добавлен в переменную окружения PATH. Добавьте путь к папке с php.exe в PATH (Windows) или используйте полный путь к бинарнику.
Ошибка: Не удалось загрузить скрипт router.php - убедитесь, что файл существует в указанной директории и имеет правильный синтаксис PHP.
Сервер запущен, но страницы не загружаются - проверьте, не блокирует ли брандмауэр порт. На Windows может потребоваться разрешить соединение для PHP.
Расширенные примеры использования встроенного PHP сервера с подробными пояснениями.
Пример 1. Запуск с конкретным документ-рутом и проверкой путей
# Создаём структуру:
mkdir myproject && cd myproject
mkdir public
mkdir public/css
echo '<?php echo "Hello, world!"; ?>' > public/index.php
echo 'body { background: #fff; }' > public/css/style.css
# Запускаем сервер с корнем public/:
php -S localhost:8080 -t public
Результат: сервер обслуживает только файлы внутри public/. Запрос http://localhost:8080/ выполнит public/index.php, а http://localhost:8080/css/style.css отдаст CSS как статику. При обращении к /../config.php сервер вернёт 404, так как выход за пределы document root блокируется.
# Откроем в браузере: # http://localhost:8080/ -> страница с текстом "Hello, world!" # http://localhost:8080/css/style.css -> содержимое CSS
Пример 2. Использование router.php для редиректов в одностраничном приложении
# Создаём router.php:
<?php
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if ($path !== '/' && !file_exists(__DIR__ . '/public' . $path)) {
// Все запросы к несуществующим файлам отправляем на index.php
$_GET['url'] = ltrim($path, '/');
require __DIR__ . '/public/index.php';
} else {
return false; // отдать файл как есть (статику)
}
?>
# Запуск:
php -S localhost:8000 -t public router.php
Результат: при запросе /about (если файла public/about нет) сервер выполняет router.php, который требует index.php. index.php может обрабатывать маршрут через $_GET['url']. Статические файлы (например, /css/app.css) отдаются напрямую.
# http://localhost:8000/about -> выполнит index.php с параметром url=about # http://localhost:8000/ => index.php (корень) или статика, если есть index.html
Пример 3. Запуск на 0.0.0.0 с несколькими одновременно работающими серверами
# Терминал 1:
php -S 0.0.0.0:8080 -t /home/user/project1
# Терминал 2:
php -S 0.0.0.0:8081 -t /home/user/project2
Теперь оба сервера видны в локальной сети. Например, если ваш IP 192.168.0.10, то project1 доступен по http://192.168.0.10:8080, project2 - по http://192.168.0.10:8081. Это удобно при работе над несколькими проектами одновременно.
# Проверка (на другом устройстве): # curl http://192.168.0.10:8080 -> ответ от project1 # curl http://192.168.0.10:8081 -> ответ от project2
Пример 4. Запуск с собственным php.ini и включением вывода ошибок
# Создаём файл dev.ini:
echo 'display_errors = On
error_reporting = E_ALL
memory_limit = 512M' > dev.ini
# Запускаем сервер с этим ini:
php -S localhost:8000 -c dev.ini
Результат: все ошибки PHP будут выводиться на экран, что полезно при отладке. Лимит памяти увеличен до 512 МБ. Убедитесь, что файл dev.ini находится в той же директории, где выполняется команда, или укажите полный путь.
# В консоли можно увидеть ошибки скриптов, если они есть.
Пример 5. Одновременный запуск с разными портами и разными корнями (кросс-проектная разработка)
# Проект A (Laravel) на порту 8000:
php -S localhost:8000 -t /var/www/laravel/public
# Проект B (WordPress) на порту 8001:
php -S localhost:8001 -t /var/www/wordpress
Каждый проект использует свой document root и свой порт. При этом оба сервера слушают только localhost, что безопасно для локальной разработки. Для доступа с других машин замените localhost на 0.0.0.0, но помните о повышенных рисках.
# В браузере: # http://localhost:8000 -> приветствие Laravel # http://localhost:8001 -> главная WordPress