PHP и Serverless: союз, который вы не ожидали
Когда мы слышим «Serverless» (или «бессерверные вычисления»), первая ассоциация — это JavaScript, Python или Go. PHP в этом контексте кажется «динозавром», который застрял в эпохе общих хостингов и монолитных WordPress. Но давайте посмотрим правде в глаза: PHP жив, здоров и более гибок, чем вы думаете.
Сегодня мы разберем, как запустить PHP-код в AWS Lambda и ее аналогах. Вы узнаете, почему serverless PHP — это не магия, а рабочий инструмент для API, обработчиков вебхуков и микросервисов. Спойлер: вам не придется отказываться от любимого языка.
Что такое Serverless на самом деле?
Давайте сразу развеем миф. «Serverless» не означает «без сервера». Это значит, что вы не думаете о сервере. Платформа (AWS, Google Cloud, Vercel) сама управляет инфраструктурой: масштабирует, обновляет, чинит. Вы просто загружаете код и платите за время его выполнения.
Для PHP это звучит как вызов. Ведь PHP традиционно требует веб-сервера (Apache, Nginx) и модуля PHP-FPM. Но технологии не стоят на месте.
Как PHP работает в бессерверной среде?
Ключевая проблема: Lambda-функции (и их аналоги) — это stateless-контейнеры, которые живут несколько секунд или минут. Они не «держат» в памяти сессию, не крутят Apache. Поэтому стандартный PHP-скрипт, который ждет $_GET или пишет в $_SESSION, нужно адаптировать.
Решение пришло в виде специальных рантаймов. Они превращают Lambda-событие (например, HTTP-запрос от API Gateway) в привычный PHP-контекст. Самый популярный инструмент для этого — Bref.
Bref: PHP-движок для AWS Lambda
Bref — это open-source проект, который позволяет запускать PHP на AWS Lambda «из коробки». Он поставляется с готовыми слоями (layers), которые включают PHP 8.x и популярные расширения (PDO, Redis, gd, mbstring).
Установка и первый запуск
Для работы вам понадобятся:
- Учетная запись AWS
- Установленный
composerиaws-cli - Node.js (для Serverless Framework)
Создадим простую функцию, которая возвращает JSON с текущим временем:
// index.php
<?php
require __DIR__ . '/vendor/autoload.php';
use Bref\Context\Context;
use Bref\Event\Http\HttpHandler;
class TimeHandler extends HttpHandler
{
public function handleRequest($request, Context $context): array
{
return [
'statusCode' => 200,
'headers' => ['Content-Type' => 'application/json'],
'body' => json_encode([
'server_time' => date('Y-m-d H:i:s'),
'php_version' => PHP_VERSION,
'message' => 'Hello from Serverless PHP!'
]),
];
}
}
return new TimeHandler();
Теперь настроим деплой. Создайте файл serverless.yml:
# serverless.yml
service: php-time-api
provider:
name: aws
region: eu-central-1
runtime: provided.al2
plugins:
- ./vendor/bref/bref
functions:
api:
handler: index.php
timeout: 28
layers:
- ${bref:layer.php-81}
events:
- httpApi: 'GET /time'
Запустите деплой:
composer require bref/bref
serverless deploy
Через минуту вы получите URL вида: https://xxx.execute-api.eu-central-1.amazonaws.com/time. Откройте его в браузере — вы увидите JSON. Поздравляю, вы только что запустили serverless PHP функцию на AWS Lambda!
Аналоги AWS Lambda для PHP
Не хотите привязываться к AWS? Есть альтернативы, которые тоже дружат с PHP.
Google Cloud Functions (с адаптацией)
Google не поддерживает PHP нативно, но вы можете использовать Cloud Run — это контейнерная среда, которая автоматически масштабируется до нуля. Вы упаковываете PHP-приложение в Docker-образ (например, на базе php:8.1-fpm-alpine) и загружаете его. Платите только за запросы — фактически это serverless.
Пример Dockerfile для Cloud Run:
FROM php:8.1-fpm-alpine
COPY . /app
WORKDIR /app
EXPOSE 8080
CMD ["php", "-S", "0.0.0.0:8080", "index.php"]
Vercel + PHP
Vercel — это облачная платформа, которая «из коробки» поддерживает PHP через серверные функции. Вы просто кладете файл api/time.php в репозиторий, и Vercel сам разворачивает его как endpoint. Минус: ограниченный runtime (нет доступа к файловой системе).
OpenFaaS (Self-hosted)
Если вам нужен полный контроль, разверните OpenFaaS на своем Kubernetes-кластере. Он поддерживает PHP-шаблоны. Это не облачный сервис, но идеология та же — платите за железо, а не за лицензии.
Когда стоит использовать Serverless PHP?
Не обольщайтесь: serverless — не панацея. Вот сценарии, где PHP на Lambda действительно блестит:
- Webhook-обработчики — платежные системы (Stripe, PayPal), Telegram-боты, GitHub Actions.
- API-прокси — трансформация данных, агрегация нескольких источников.
- Крошечные микросервисы — генерация PDF, ресайз картинок, отправка email.
- CRON-задачи — запуск по расписанию (через CloudWatch Events).
Но если у вас тяжелый фреймворк (Laravel, Symfony) с ORM, сессиями и очередями — не пытайтесь запихнуть его в Lambda целиком. Вы получите холодный старт в 5-10 секунд и проблемы с подключением к БД. Для таких проектов лучше использовать AWS Fargate (контейнеры) или традиционный VPS.
Подводные камни и ограничения
Холодный старт
Когда функция не используется 15-30 минут, AWS выгружает ее из памяти. Следующий запрос запускает контейнер с нуля — это занимает 1-3 секунды. Для PHP это критично, так как нужно загрузить все зависимости (Composer autoload). Решение: держите функцию «теплой» с помощью CloudWatch Events (каждые 5 минут отправляйте фейковый запрос).
Ограничения по времени
Lambda-функция может выполняться максимум 15 минут (900 секунд). Для HTTP-запросов через API Gateway лимит — 29 секунд. Если ваш скрипт работает д