Создание локального сервера PHP для проектов
Основные способы настройки локального сервера PHP
Встроенный сервер PHP (самый простой способ)
Начиная с версии 5.4, PHP поставляется со встроенным сервером. Он идеально подходит для быстрого запуска одного проекта без установки дополнительного ПО. Для работы достаточно иметь установленный PHP и терминал.
Как запустить локальный сервер PHP из командной строки?
php -S localhost:8000
После выполнения команды сервер запустится на порту 8000, а корнем сайта станет текущая папка. Для указания другой директории используется:
php -S localhost:8000 -t /путь/к/папке
Как определить маршрутизатор (router) для всех запросов?
php -S localhost:8000 index.php
Если в папке есть index.php, сервер будет перенаправлять все не найденные файлы на него.
Проблема: Сервер не видит файлы, не загружается страница.
Решение: Проверьте, что PHP добавлен в переменную PATH. В Windows выполните where php, в Linux/macOS - which php. Убедитесь, что порт не занят: netstat -ano | grep 8000.
Проблема: Ошибка "Address already in use".
Решение: Укажите другой порт, например 8080: php -S localhost:8080.
Вариант 1: XAMPP (полный пакет Apache + MySQL + PHP)
XAMPP - это кроссплатформенный дистрибутив, включающий веб-сервер Apache, PHP, MariaDB и Perl. Подходит для разработки сложных проектов с базами данных.
Как установить и запустить XAMPP на Windows?
- Скачайте XAMPP и запустите установщик.
- Выберите компоненты (по умолчанию: Apache, PHP, phpMyAdmin).
- После установки откройте панель управления XAMPP и нажмите "Start" для Apache.
По умолчанию корневая папка проектов - C:\xampp\htdocs. Положите туда файлы и откройте в браузере http://localhost/имяфайла.php.
Проблема: Порт 80 занят (например, Skype или IIS).
Решение: В панели XAMPP нажмите "Config" → "Apache (httpd.conf)", найдите строку Listen 80 и измените на Listen 8080. Затем перезапустите Apache. Доступ к серверу будет по http://localhost:8080.
Как добавить виртуальные хосты в XAMPP?
# Откройте файл C:\xampp\apache\conf\extra\httpd-vhosts.conf
# Добавьте:
<VirtualHost *:80>
DocumentRoot "C:/xampp/htdocs/mysite"
ServerName mysite.local
</VirtualHost>
Также добавьте в файл hosts (Windows: C:\Windows\System32\drivers\etc\hosts) строку: 127.0.0.1 mysite.local.
Вариант 2: Docker (контейнер с PHP и Apache)
Docker позволяет изолировать окружение и повторять конфигурацию на любых системах. Подходит для командной разработки и деплоя.
Как создать локальный сервер PHP через Docker?
# Создайте Dockerfile:
FROM php:8.2-apache
COPY . /var/www/html/
EXPOSE 80
# Запустите:
docker build -t my-php-site .
docker run -d -p 8080:80 my-php-site
Теперь сайт доступен на http://localhost:8080.
Проблема: Пустая страница, ошибка 500.
Решение: Проверьте права на файлы: в Docker контейнере Apache часто работает под www-data. Временно измените права: chmod -R 755 /var/www/html.
Как подключить MariaDB?
# docker-compose.yml:
version: '3'
services:
web:
image: php:8.2-apache
ports:
- "8080:80"
volumes:
- ./site:/var/www/html
db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: root
Вариант 3: Ручная установка PHP + Apache (Linux)
Для тех, кто предпочитает полный контроль над конфигурацией. Цель - настроить собственный сервер без готовых сборок.
Как установить Apache и PHP на Ubuntu?
sudo apt update
sudo apt install apache2 php libapache2-mod-php
sudo systemctl restart apache2
Поместите файлы в /var/www/html/ и откройте http://localhost.
Проблема: Браузер скачивает PHP файл вместо исполнения.
Решение: Убедитесь, что модуль libapache2-mod-php установлен и включен: sudo a2enmod php8.2 (версия может отличаться).
Как настроить виртуальные хосты вручную?
# Создайте файл /etc/apache2/sites-available/mysite.conf:
<VirtualHost *:80>
ServerAdmin admin@example.com
DocumentRoot /var/www/mysite
ServerName mysite.local
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
# Активируйте и перезагрузите:
sudo a2ensite mysite.conf
sudo systemctl reload apache2
Вариант 4: Встроенный сервер с PHP-FPM и Nginx (продвинутый)
Для высоконагруженных проектов или при необходимости нестандартной конфигурации. PHP-FPM обеспечивает быструю обработку запросов.
Как установить PHP-FPM и Nginx на Ubuntu?
sudo apt install nginx php-fpm
sudo systemctl start nginx php8.2-fpm
Настройте серверный блок в /etc/nginx/sites-available/default:
server {
listen 80;
root /var/www/html;
index index.php index.html;
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
Проблема: Ошибка 502 Bad Gateway.
Решение: Проверьте, что PHP-FPM запущен: sudo systemctl status php8.2-fpm. Если сокет не совпадает, укажите правильный путь в fastcgi_pass.
Расширенные примеры настройки и конфигурации
Пример 1. Запуск нескольких сайтов на встроенном сервере с помощью маршрутизации
Можно создать один скрипт-роутер, который будет направлять запросы к разным папкам в зависимости от домена.
// router.php
$uri = $_SERVER['REQUEST_URI'];
$host = $_SERVER['HTTP_HOST'];
// Виртуальные хосты
$sites = [
'site1.local' => '/path/to/site1',
'site2.local' => '/path/to/site2',
];
if (isset($sites[$host])) {
$docRoot = $sites[$host];
$file = $docRoot . $uri;
if (file_exists($file)) {
return false; // отдать статику напрямую
}
// Иначе передать в index.php проекта
$_SERVER['DOCUMENT_ROOT'] = $docRoot;
require $docRoot . '/index.php';
} else {
http_response_code(404);
echo 'Сайт не найден';
}
Результат: при обращении к http://site1.local:8000/ сервер будет обслуживать файлы из /path/to/site1.
Пример 2. Включение логирования запросов во встроенном сервере
Команда запуска с записью логов в файл:
php -S localhost:8000 -t /var/www/mysite 2>&1 | tee server.log
Или через дополнительный параметр PHP_CLI_SERVER_WORKERS (для многопоточности в PHP 8.0+):
PHP_CLI_SERVER_WORKERS=4 php -S localhost:8000
Результат: сервер обрабатывает до 4 одновременных запросов.
Пример 3. Настройка php.ini для локального сервера
Создайте файл user.ini в корне проекта, который будет применяться только к этому серверу:
; user.ini
upload_max_filesize = 32M
post_max_size = 32M
max_execution_time = 120
display_errors = On
log_errors = On
error_log = /tmp/php-errors.log
Запустите сервер с указанием ini-файла:
php -S localhost:8000 -c user.ini
Результат: настройки из user.ini переопределяют глобальные.
Пример 4. Использование встроенного сервера с HTTPS (самоподписанный сертификат)
Сгенерируйте сертификат с помощью OpenSSL:
openssl req -new -x509 -keyout server.key -out server.crt -days 365 -nodes -subj "/C=RU/ST=State/L=City/O=Company/CN=localhost"
Запустите сервер с поддержкой TLS:
php -S localhost:443 -t /var/www/html server.crt server.key
Результат: сайт доступен по https://localhost/. Браузер покажет предупреждение о небезопасном сертификате.
Пример 5. Имитация задержек и ошибок (для тестирования)
Создайте скрипт, который имитирует медленный ответ или ошибку 500:
// slow.php
sleep(5); // задержка 5 секунд
http_response_code(500);
echo 'Внутренняя ошибка сервера';
Запустите встроенный сервер с этим скриптом как роутером:
php -S localhost:8000 slow.php
Результат: любой запрос сначала ждет 5 секунд, затем получает HTTP 500.