PHP-FPM + Nginx - класична схема:
клієнт → Nginx (статика, TLS, проксі) → FastCGI → PHP-FPM (пул процесів) → Laravel
- Nginx віддає статичні файли й передає PHP-запити в PHP-FPM;
- PHP-FPM тримає пул процесів; кожен запит - чисте завантаження застосунку з нуля;
- у Docker - два контейнери (Nginx і PHP-FPM, зі спільним доступом до
public/) або один з менеджером процесів; - плюси: перевірена роками схема, ізоляція запитів (витоки пам'яті й глобальний стан не переживають запит), будь-який код Laravel працює без змін;
- мінуси: два процеси й конфігурації, бутстрап фреймворку на кожен запит.
FrankenPHP - сучасний сервер застосунків:
- вебсервер Caddy з вбудованим PHP - один бінарний файл, один процес у контейнері;
- автоматичний HTTPS, HTTP/2 і HTTP/3, стиснення, Early Hints;
- два режими:
- класичний - як PHP-FPM: кожен запит завантажує застосунок заново;
- worker mode (через Laravel Octane) - застосунок завантажується один раз, а запити обробляються в довгоживучих процесах. Відповіді значно швидші, бо бутстрап фреймворку зникає.
FROM dunglas/frankenphp:1-php8.5
COPY . /app
CMD ["php", "artisan", "octane:frankenphp", "--host=0.0.0.0", "--port=8000"]
Порівняння:
| PHP-FPM + Nginx | FrankenPHP | |
|---|---|---|
| процеси в контейнері | два (або два контейнери) | один |
| конфігурація | nginx.conf + пул FPM |
Caddyfile або параметри Octane |
| продуктивність | бутстрап на кожен запит | з Octane - бутстрап один раз |
| сумісність коду | повна | worker mode вимагає уважності до стану |
| HTTPS, HTTP/3 | налаштовувати | вбудовано |
Що враховувати з worker mode: стан між запитами зберігається - статичні властивості, синглтони з даними користувача, кешування в пам'яті можуть «протікати» між запитами різних користувачів. Код і пакети мають бути готові до Octane.
Практичний вибір: для нового проєкту FrankenPHP спрощує образ і дає запас продуктивності; PHP-FPM - безпечний вибір для застарілого коду чи пакетів, не готових до довгоживучих процесів.