Локальное окружение для PHP: от простого сервера до контейнеризации

Раздел: 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
# Вывод списка всех ссылок

Локальное тестирование PHP - comments

En
Local test php (php)