Запуск приложений на PHP: серверные методы
Основной способ: встроенный сервер PHP
Встроенный сервер PHP запускается командой php -S. Он предназначен для разработки и тестирования, не для production.
Пример базового запуска: php -S localhost:8000. После этого приложение доступно по адресу http://localhost:8000.
Параметры: -t указывает корневую директорию, -c путь к php.ini, можно указать файл маршрутизации.
Проблема: порт 8000 уже занят. Решение: указать другой порт, например php -S localhost:8080, или завершить процесс, занимающий порт.
Как запустить сервер с конкретной корневой папкой?
Используется флаг -t. Пример: php -S localhost:8000 -t public. Сервер будет обслуживать файлы из папки public.
php -S localhost:8000 -t publicPhp run server (запуск php сервера)
Как запустить PHP сервер в фоновом режиме?
Добавление & в конце команды переводит процесс в фон. Для подавления вывода используется перенаправление.
php -S 0.0.0.0:8080 -t public > /dev/null 2>&1 &
После этого сервер работает в фоне. Для остановки нужно найти PID и выполнить kill PID.
nohup или менеджер процессов.Как изолировать PHP окружение с помощью Docker?
Docker-образ php:apache содержит Apache и PHP. Запуск: docker run -d -p 8080:80 -v $(pwd):/var/www/html php:apache.
docker run -d -p 8080:80 -v $(pwd):/var/www/html php:apache
Приложение доступно на порту 8080. Для PHP-FPM используется образ php:fpm вместе с nginx.
--user.Как организовать production-подобное окружение с nginx?
Установка nginx и php-fpm. Пример конфигурации nginx для проксирования на php-fpm. Команда запуска: sudo service nginx start && sudo service php7.4-fpm start.
# Пример конфигурации nginx
server {
listen 80;
root /var/www/html;
index index.php;
location ~ [.]php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
После настройки перезапустить nginx.
Как обрабатывать все запросы через один скрипт?
Указание файла маршрутизации при запуске: php -S localhost:8000 router.php. В router.php можно реализовать обработку URI.
// router.php
$ext = pathinfo($_SERVER['REQUEST_URI'], PATHINFO_EXTENSION);
if (in_array($ext, ['png', 'jpg', 'jpeg', 'gif', 'css', 'js', 'ico'])) {
return false; // отдать статический файл
} else {
// запустить приложение
include 'index.php';
}
Расширенные примеры и сценарии
Пример router.php с полной маршрутизацией
Файл router.php определяет, какие запросы обрабатывать как статические, а какие передавать в index.php.
<?php
// router.php
$uri = $_SERVER['REQUEST_URI'];
$path = parse_url($uri, PHP_URL_PATH);
$ext = pathinfo($path, PATHINFO_EXTENSION);
$staticExtensions = ['png', 'jpg', 'jpeg', 'gif', 'css', 'js', 'ico'];
if (in_array($ext, $staticExtensions) && file_exists(__DIR__ . $path)) {
return false;
}
// Все остальные запросы направляем в приложение
$_SERVER['SCRIPT_NAME'] = '/index.php';
require 'index.php';
Результат: при обращении к /style.css сервер отдаёт файл, если он существует; в остальных случаях запускается index.php.
$ curl -I http://localhost:8000/style.css HTTP/1.1 200 OK ...
Docker-compose с nginx и php-fpm
Файл docker-compose.yml создаёт два контейнера: nginx и php-fpm, соединённые через сеть.
version: '3'
services:
web:
image: nginx:alpine
ports:
- '8080:80'
volumes:
- ./public:/var/www/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
php:
image: php:7.4-fpm
volumes:
- ./public:/var/www/html
Конфигурация nginx (файл nginx.conf):
server {
listen 80;
root /var/www/html;
index index.php;
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.
$ docker-compose up -d Creating network project_default with the default driver Creating project_php_1 ... done Creating project_web_1 ... done
Скрипт для управления встроенным сервером
Скрипт start.sh позволяет запускать, останавливать и перезапускать сервер.
#!/bin/bash
PORT=${1:-8000}
DOCROOT=${2:-.}
PID_FILE='/tmp/php-server.pid'
case "$3" in
start)
php -S 0.0.0.0:$PORT -t $DOCROOT > /dev/null 2>&1 &
echo $! > $PID_FILE
echo 'Server started on port' $PORT
;;
stop)
if [ -f $PID_FILE ]; then
kill $(cat $PID_FILE) 2>/dev/null
rm $PID_FILE
echo 'Server stopped'
else
echo 'PID file not found'
fi
;;
restart)
$0 $PORT $DOCROOT stop
$0 $PORT $DOCROOT start
;;
*)
echo 'Usage:' $0 '[port] [docroot] {start|stop|restart}'
;;
esac
Пример использования: ./start.sh 8080 public start.
$ ./start.sh 8080 public start Server started on port 8080
Запуск с SSL (самоподписанный сертификат)
Встроенный сервер не поддерживает HTTPS напрямую. Можно использовать прокси на nginx или stunnel. Пример с stunnel.
# stunnel.conf
[https]
accept = 443
connect = 8000
cert = /etc/stunnel/stunnel.pem
Запуск stunnel и php сервера на 8000. Затем https://localhost указывает на PHP.
Результат: защищённое соединение для разработки.
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout stunnel.pem -out stunnel.pem ... $ stunnel stunnel.conf
Использование переменных окружения
Сервер PHP может читать переменные окружения. Установка перед запуском:
export APP_ENV=development
php -S localhost:8000 -t public
В PHP коде доступ через getenv('APP_ENV').
$ curl http://localhost:8000/env.php
array(1) {
['APP_ENV']=>
string(11) 'development'
}