Веб-сервер для PHP проектов: от простого запуска до Docker
Методы запуска локального PHP сервера
Как запустить минимальный сервер без установки стороннего ПО?
Самый быстрый способ - использовать встроенный сервер PHP. Команда php -S запускает сервер разработки на указанном хосте и порте.
php -S localhost:8000 -t /путь/к/проектуMod rewrite index php (настройка mod_rewrite для index.php)
Параметр -t задаёт корневую директорию. Если опустить, используется текущая папка.
Пример для проекта в папке myproject с точкой входа public/index.php:
cd myproject
php -S localhost:8080 -t publicUpstream php fpm (настройка upstream для php-fpm в nginx)
После запуска сервер будет доступен по адресу http://localhost:8080.
Типичные ошибки:
- Ошибка 'Address already in use' - порт занят. Решение: указать другой порт (
php -S localhost:8081) или завершить процесс, использующий порт. - Сервер не видит изменения файлов - встроенный сервер не перезагружается автоматически. Требуется завершить и запустить заново.
Как получить полноценный сервер с Apache, MySQL и PHP?
Для более сложных проектов подходят сборки XAMPP, OpenServer или MAMP. Они включают Apache, PHP и MySQL в одном пакете.
После установки XAMPP можно запустить панель управления и включить Apache и MySQL. Корневая папка по умолчанию htdocs. Проект размещается в ней.
# Linux (пример для Ubuntu)
sudo /opt/lampp/lampp startзапустить локальный сервер php (запуск локального сервера php)
Проблема: если порт 80 занят, его можно изменить в конфигурации Apache (файл httpd.conf).
Частая ошибка: конфликт портов с Windows IIS. Решение - отключение IIS или смена порта Apache на 8080.
Как изолировать окружение PHP с помощью Docker?
Docker позволяет запустить PHP в изолированном контейнере с точными версиями.
docker run -d -p 8080:80 -v "$PWD":/var/www/html php:7.4-apachePhp non thread safe (php non-thread-safe (не потокобезопасная версия))
Эта команда монтирует текущую папку в контейнер и запускает сервер Apache с PHP 7.4.
Проблемы: Docker не установлен, ошибка прав доступа к папке (решение - добавить пользователя в группу docker).
Как обрабатывать все запросы через единый контроллер?
Встроенный сервер поддерживает файл маршрутизации. Можно создать router.php и передать его через аргумент.
php -S localhost:8000 router.phpRewritecond request filename php (правило rewritecond для php в .htaccess)
Пример содержимого router.php:
<?php
$uri = $_SERVER['REQUEST_URI'];
if (preg_match('/\.(?:png|jpg|jpeg|css|js)$/', $uri)) {
return false; // отдать файл статики
}
$_SERVER['SCRIPT_NAME'] = '/index.php';
require 'index.php';Проблема: все запросы проходят через PHP, что снижает производительность для статики.
Расширенные примеры запуска и настройки
1. Запуск сервера в фоновом режиме
Для работы сервера без привязки к терминалу применяется амперсанд или nohup:
nohup php -S 0.0.0.0:8000 -t public > /dev/null 2>&1 &Сервер будет работать до завершения процесса.
2. Запуск с собственным php.ini
Можно указать путь к php.ini через опцию -c:
php -c /etc/php/7.4/cli/php.ini -S localhost:80003. Docker Compose для PHP + Nginx
Пример файла docker-compose.yml:
version: '3'
services:
php:
image: php:7.4-fpm
volumes:
- ./src:/var/www/html
nginx:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
- ./nginx.conf:/etc/nginx/conf.d/default.confФайл nginx.conf содержит конфигурацию для передачи запросов PHP-FPM.
4. Автоматический перезапуск при изменениях с помощью entr
Утилита entr перезапускает команду при изменении файлов:
ls *.php | entr -r php -S localhost:8000Или для ограничения директории:
find src/ -name '*.php' | entr -r php -S localhost:8080 -t src/5. Множественные точки входа с роутером
Пример router.php для обработки путей и работы с Composer:
<?php
require __DIR__ . '/vendor/autoload.php';
$router = new AltoRouter();
$router->setBasePath('/');
$router->map('GET', '/', function() { echo 'Home'; });
$router->map('GET', '/users/[i:id]', function($id) { echo "User $id"; });
$match = $router->match();
if ($match && is_callable($match['target'])) {
call_user_func_array($match['target'], $match['params']);
} else {
http_response_code(404);
echo 'Not Found';
}Для проверки можно выполнить php -S localhost:8000 router.php и открыть localhost:8000/users/123.
6. Запуск сервера с поддержкой HTTPS (самоподписанный сертификат)
Встроенный сервер не поддерживает HTTPS напрямую. Обход через stunnel или локальный прокси. Альтернатива - использование Symfony Local Web Server, который генерирует сертификаты.
# Установка symfony-cli
curl -sS https://get.symfony.com/cli/installer | bash
symfony server:start --port=443 --no-tls=false