Локальное окружение для PHP: от простого сервера до контейнеризации
Встроенный веб-сервер PHP
Как запустить PHP-скрипт без установки Apache или Nginx?
Встроенный сервер появляется в PHP 5.4 и не требует дополнительных программ. Он подходит для быстрого тестирования небольших проектов, API или учебных задач.
Запуск
php -S localhost:8000 -t /путь/к/проектуLocal test php (локальное тестирование php)
Сервер обслуживает файлы из указанной папки на порту 8000. Для остановки нужно нажать Ctrl+C.
Проблема: порт уже занят другой программой. Решение: изменить порт, например, php -S localhost:8080 или убить процесс, занимающий порт (команда netstat -ano | findstr :8000 в Windows или lsof -i :8000 в Linux/macOS).
Ещё одна типичная ошибка: сервер не видит файл index.php в корне. Нужно явно указывать роутер или использовать -t с верной папкой.
Роутер (router.php)
php -S localhost:8000 router.phpФайл router.php обрабатывает все запросы. Пример содержимого:
// router.php
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if (file_exists(__DIR__ . $uri)) return false;
echo '404 - страница не найдена';Этот подход используют в микрофреймворках или для имитации rewrite.
Docker-контейнеры с PHP
Как создать изолированное окружение для тестирования, чтобы не захламлять систему?
Docker позволяет поднять сервер с любой версией PHP, дополнительными расширениями и без конфликтов с другими проектами.
Простой Dockerfile
FROM php:8.2-cli
WORKDIR /app
COPY . .
CMD ["php", "-S", "0.0.0.0:8000"]docker build -t php-test .
docker run -p 8000:8000 php-testПроблема: медленная пересборка при каждом изменении кода. Решение: подключить монтирование тома: docker run -p 8000:8000 -v $(pwd):/app php-test.
docker-compose с Nginx + PHP-FPM
version: '3'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./project:/var/www/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf
php:
image: php:8.2-fpm
volumes:
- ./project:/var/www/htmlТакой стек имитирует реальный production-сервер и подходит для тестирования совместимости.
XAMPP (Apache + MariaDB + PHP)
Как получить сразу готовый веб-сервер с базой данных и PHP?
XAMPP устанавливает все компоненты в один пакет. Управление через панель управления или команды.
Запуск из командной строки (без GUI)
# Windows
C:\xampp\apache_start.bat
# Linux/macOS (из папки XAMPP)
sudo ./lampp startПосле запуска проект кладётся в htdocs. Для изменения корневой директории нужно править httpd.conf.
Проблема: порт 80 занят Skype или IIS. Решение: изменить порт в Apache (Listen 8080) или отключить конфликтующий сервис.
Также часто забывают включить нужные расширения (например, extension=curl в php.ini).
Расширенные примеры использования инструментов
1. Встроенный сервер с несколькими проектами
Запуск двух независимых серверов для разных папок:
php -S localhost:8001 -t /home/user/site1
php -S localhost:8002 -t /home/user/site2Результат: site1 доступен на порту 8001, site2 на 8002.
2. Тестирование API с помощью curl
После запуска сервера с роутером:
php -S localhost:8888 api.php &Отправка запросов:
curl -X GET http://localhost:8888/users
curl -X POST -H "Content-Type: application/json" -d '{"name":"test"}' http://localhost:8888/usersРезультат: вывод JSON-ответа из api.php.
3. Docker: передача переменных окружения
FROM php:8.2-cli
COPY . /app
WORKDIR /app
ENV APP_ENV=testing
CMD ["php", "test.php"]docker run -e DB_HOST=mysql-test my-php-appРезультат: скрипт test.php может читать $_ENV['DB_HOST'].
4. XAMPP: включение расширения без переустановки
# Windows - в php.ini раскомментировать строку
;extension=gd -> extension=gd
# Linux/macOS - после правки перезапустить Apache
sudo ./lampp restartПроблема: расширение не появилось после правки php.ini. Решение: проверить путь к php.ini через php --ini и убедиться, что файл DLL/so существует в папке ext.
5. Альтернатива: Laravel Valet (macOS)
composer global require laravel/valet
valet install
cd ~/Sites && valet parkТеперь любой проект в ~/Sites доступен как http://project.test. Это удобно, когда нужно тестировать несколько проектов на одном компьютере.
valet links # Вывод списка всех ссылок