Локальная разработка на PHP: инструменты и конфигурации

Раздел: Администрирование PHP-окружения -> Локальная разработка

Основные подходы к локальному PHP

Как быстро запустить PHP-скрипт без установки Apache или Nginx?

Встроенный сервер PHP (php -S) - самое лёгкое и быстрое решение. Он появляется в PHP 5.4+ и не требует дополнительного ПО.

# Запуск сервера в текущей папке на порту 8000
php -S localhost:8000

Php 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-окружение, адаптированное под конкретные задачи. Выбор метода зависит от уровня изоляции, требуемой кастомизации и простоты воспроизведения.

Локальный PHP - comments

En
Php local (php)