Запуск приложений на 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 public

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

Проблемы с правами доступа к папкам. Решение: указать пользователя в Dockerfile или использовать флаг --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.

Ошибка 502 Bad Gateway при неправильной настройке сокета или порта php-fpm. Проверить статус php-fpm.

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

Указание файла маршрутизации при запуске: 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 допущена ошибка, сервер может вернуть 404. Необходимо тестировать маршрутизацию.

Расширенные примеры и сценарии

Пример 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'
}

Запуск PHP сервера - comments

En
Php run server (php)