Локальная разработка на PHP: инструменты и конфигурации
Основные подходы к локальному PHP
Как быстро запустить PHP-скрипт без установки Apache или Nginx?
Встроенный сервер PHP (php -S) - самое лёгкое и быстрое решение. Он появляется в PHP 5.4+ и не требует дополнительного ПО.
# Запуск сервера в текущей папке на порту 8000
php -S localhost:8000Php local (локальный php)
Listening on http://localhost:8000 Document root is /home/user/project Press Ctrl-C to quit.
Сервер автоматически обрабатывает запросы, передавая их PHP. Если запрошенный файл существует, он выполняется; иначе возвращается 404. Для кастомной маршрутизации указывают скрипт-роутер:
php -S localhost:8000 router.php
Проблема: порт занят. Решение: использовать другой порт (php -S localhost:8080) или завершить процесс, занимающий порт.
Проблема: сервер не видит изменения в файлах (кеширование OPcache). Решение: отключить OPcache в php.ini или перезапускать сервер после изменений.
Как получить готовый стек Apache + MySQL + PHP за несколько минут?
XAMPP (или MAMP на macOS) - это сборка Apache, MySQL, PHP и Perl с панелью управления. Установка занимает один файл. После установки достаточно запустить панель и нажать Start для Apache и MySQL.
# Linux: запуск служб из терминала
sudo /opt/lampp/lampp start
Starting XAMPP for Linux 8.2.12... XAMPP: Starting Apache...ok. XAMPP: Starting MySQL...ok.
Веб-сервер слушает на http://localhost:8080 (по умолчанию 80, но может быть изменён). Для добавления своего сайта файлы помещают в /opt/lampp/htdocs/your_project.
Проблема: порт 80 уже занят. Решение: изменить порт в файле /opt/lampp/etc/httpd.conf, заменив Listen 80 на Listen 8080.
Проблема: конфликт с уже установленным MySQL. Решение: остановить системную MySQL или изменить порт XAMPP MySQL.
Как изолировать PHP-окружение с точными версиями PHP, веб-сервером и БД?
Docker позволяет поднять контейнеры с нужными версиями. Пример docker-compose.yml для PHP 8.2 с Nginx и MariaDB:
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./app:/var/www/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf
php:
image: php:8.2-fpm-alpine
volumes:
- ./app:/var/www/html
db:
image: mariadb:10.11
environment:
MYSQL_ROOT_PASSWORD: example
Запуск командой docker-compose up -d. Вся среда изолирована, легко пересоздаётся или удаляется.
Проблема: образ PHP не содержит нужных расширений. Решение: создать собственный Dockerfile на основе php:8.2-fpm-alpine и установить расширения через docker-php-ext-install.
Проблема: медленная работа на Windows/Mac из-за файлового монтирования. Решение: использовать volume типа :cached или настроить мультиплатформенный драйвер (например, Mutagen).
Как управлять несколькими версиями PHP на одной машине без Docker?
phpbrew - утилита для установки и переключения версий PHP в домашней директории. Пример установки:
# Установка phpbrew
curl -L -O https://github.com/phpbrew/phpbrew/releases/latest/download/phpbrew.phar
chmod +x phpbrew.phar
sudo mv phpbrew.phar /usr/local/bin/phpbrew
# Установка PHP 8.3 с расширениями
phpbrew install 8.3 +default +mysql +xml +curl
# Переключение
phpbrew use 8.3
Installing PHP 8.3... Build finished successfully. Now you can use 'phpbrew switch 8.3' to enable it.
phpbrew создаёт изолированную среду: каждая версия PHP имеет свои php.ini, модули и CLI. Можно переключаться между проектами, не влияя на систему.
Проблема: не хватает зависимостей для компиляции. Решение: доустановить пакеты (например, libxml2-dev, libsqlite3-dev).
Проблема: расширение не собралось. Решение: проверить вывод phpbrew install --debug и добавить флаги (например, +pdo_mysql).
Как собрать PHP из исходников с нестандартными опциями?
Компиляция вручную даёт полный контроль над модулями. Пример для PHP 8.2 на Linux:
# Скачать и распаковать
wget https://www.php.net/distributions/php-8.2.15.tar.gz
tar -xzf php-8.2.15.tar.gz
cd php-8.2.15
# Настройка с нужными расширениями
./configure --prefix=/usr/local/php8.2 \
--with-pdo-mysql \
--with-openssl \
--enable-mbstring \
--with-curl
# Сборка и установка
make -j4
sudo make install
После установки php будет доступен по пути /usr/local/php8.2/bin/php.
Проблема: configure не находит библиотеки. Решение: установить пакеты -dev (например, libssl-dev, libcurl4-openssl-dev).
Проблема: make вылетает с ошибкой. Решение: проверить, что хватает оперативной памяти (на виртуальной машине может не хватить).
Каждый из описанных методов имеет свои цели: встроенный сервер - для быстрой проверки скриптов и мелких проектов; XAMPP - для классической LAMP-среды без глубокой настройки; Docker - для повторяемых и изолированных сред; phpbrew - для переключения версий на одной ОС; компиляция - для экстремальной кастомизации.
Расширенные примеры настройки локального PHP
1. Встроенный сервер с роутером и обработкой ошибок
Создадим router.php, который эмулирует mod_rewrite: все запросы, кроме существующих файлов, направляются на index.php.
<?php
// router.php
$uri = $_SERVER['REQUEST_URI'];
if (file_exists(__DIR__ . '/' . $uri) && $uri !== '/') {
return false; // отдать статический файл
}
// Иначе все запросы идут на index.php
$_GET['_url'] = $uri;
require 'index.php';
# Запуск с роутером
php -S localhost:8000 router.php
При запросе http://localhost:8000/some/path сервер не ищет файл, а передаёт управление index.php, который может разобрать URL.
2. Docker: PHP-FPM + Nginx с поддержкой мультисайтов
Файловая структура:
project/
docker-compose.yml
nginx/
default.conf
app/
site1/
index.php
site2/
index.php
docker-compose.yml:
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./app:/var/www/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
php:
image: php:8.2-fpm-alpine
volumes:
- ./app:/var/www/html
working_dir: /var/www/html
nginx/default.conf:
server {
listen 80;
server_name localhost;
root /var/www/html;
location /site1/ {
try_files $uri $uri/ /site1/index.php$is_args$args;
}
location /site2/ {
try_files $uri $uri/ /site2/index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Запуск: docker-compose up -d. Теперь http://localhost:8080/site1/ использует свой index.php.
3. phpbrew: установка расширения Xdebug для конкретной версии
# Установка Xdebug для текущей используемой версии PHP (например, 8.3)
phpbrew ext install xdebug 3.3.2
# Проверка
php -m | grep xdebug
xdebug
Для включения Xdebug в php.ini (найденном через php --ini) добавить:
zend_extension=xdebug.so
xdebug.mode=debug
xdebug.start_with_request=yes
phpbrew также позволяет создать алиас (символическую ссылку) для версии:
phpbrew alias 8.3.12 project-php
# Теперь можно использовать command: phpbrew use project-php
4. Компиляция PHP с поддержкой SQLite3 и GD
./configure --prefix=/usr/local/php8.3 \
--with-pdo-sqlite \
--with-gd --with-freetype-dir=/usr/include/freetype2 \
--enable-gd-jis-conv \
--with-zlib
make -j$(nproc)
sudo make install
# Проверка расширений
/usr/local/php8.3/bin/php -m | grep -E 'sqlite|gd'
gd pdo_sqlite sqlite3
Если freetype не найден, установите libfreetype6-dev и передайте правильный путь (обычно /usr/include/freetype2).
5. Встроенный сервер с HTTPS через самоподписанный сертификат
# Генерация самоподписанного сертификата
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/CN=localhost"
# Запуск HTTPS сервера
php -S localhost:8443 -c php.ini -t /path/to/project --cert cert.pem --key key.pem
В браузере - предупреждение о недоверенном сертификате, но для локальной разработки это приемлемо.
Результат каждого примера: вы получите работающее локальное PHP-окружение, адаптированное под конкретные задачи. Выбор метода зависит от уровня изоляции, требуемой кастомизации и простоты воспроизведения.