1

Веб-сервер для PHP проектов: от простого запуска до Docker

Раздел: веб-разработка на PHP -> настройка веб-сервера

Методы запуска локального 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 public

Upstream 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-apache

Php non thread safe (php non-thread-safe (не потокобезопасная версия))

Эта команда монтирует текущую папку в контейнер и запускает сервер Apache с PHP 7.4.

Проблемы: Docker не установлен, ошибка прав доступа к папке (решение - добавить пользователя в группу docker).

Как обрабатывать все запросы через единый контроллер?

Встроенный сервер поддерживает файл маршрутизации. Можно создать router.php и передать его через аргумент.

php -S localhost:8000 router.php

Rewritecond 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, что снижает производительность для статики.

- Var www html index php (размещение index.php в var/www/html)
- веб серверы 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:8000

3. 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

запуск локального сервера PHP - comments

En
запустить локальный сервер php (php)