PHP без сервера: миф или реальность?
Когда слышишь словосочетание "Serverless функции", первая ассоциация обычно — Node.js или Python. PHP кажется монолитом, который живёт на вечном Apache или Nginx. Но времена меняются. Сегодня PHP в serverless-архитектуре — это не экзотика, а рабочий инструмент для тысяч проектов. Вы можете писать микросервисы, обрабатывать вебхуки, ресайзить картинки и даже запускать полноценные API, не думая о серверах, масштабировании и оплате простаивающих мощностей.
В этой статье мы разберём, как работает PHP на AWS Lambda, какие есть альтернативы (Bref, OpenFaaS, Vercel), и главное — напишем реальный код, который можно сразу запустить. Если вы PHP-разработчик и хотите шагнуть в modern cloud-native разработку — вы по адресу.
Что такое Serverless и почему PHP-разработчику это нужно?
Serverless (или FaaS — Functions as a Service) — это модель, где вы загружаете свой код, а провайдер сам решает, когда и как его запускать. Вы платите только за фактическое время выполнения. Никаких виртуальных машин, никакого "апача", который жрёт память 24/7. Для PHP, который долго считался "языком для хостинга с FTP", это глоток свежего воздуха.
Преимущества для PHP-проектов:
- Экономия — не нужно держать целый сервер ради одного скрипта.
- Автомасштабирование — Lambda сама создаёт копии функции при росте нагрузки.
- Простота деплоя — залил код, и он работает.
- Микросервисный подход — можно разбить монолит на мелкие функции.
Проблема: PHP из коробки не умеет быть Serverless
Классический PHP не является демоном. Он запускается, выполняет скрипт и умирает. Для Lambda это проблема: функция должна быть "холодной" и стартовать за миллисекунды. Обычный PHP стартует медленно (загрузка фреймворка, автозагрузка, конфиги). Решение — Bref.
Bref — главный инструмент для Serverless PHP
Bref — это open-source SDK и рантайм, который превращает PHP в native Lambda-функцию. Он компилирует PHP в статический бинарник (через bref/bref), что даёт мгновенный холодный старт. Bref поддерживает Laravel, Symfony, Slim и любой кастомный код.
Как работает Bref?
Вы пишете обычный PHP-класс, реализуете интерфейс Bref\Context\Context, и Bref берёт на себя HTTP-обработку. Для API достаточно одной функции.
Пример: Serverless API на PHP для генерации QR-кодов
Допустим, нам нужно получать POST-запрос с текстом и возвращать QR-код в формате PNG. Пишем функцию:
<?php
// handler.php
require __DIR__ . '/vendor/autoload.php';
use Bref\Context\Context;
use Bref\Event\Http\HttpHandler;
use chillerlan\QRCode\QRCode;
use chillerlan\QRCode\QROptions;
class QrGenerator extends HttpHandler
{
public function handleRequest($request, Context $context): array
{
$body = json_decode($request->getBody()->getContents(), true);
$text = $body['text'] ?? 'Hello, Serverless!';
$options = new QROptions([
'outputType' => QRCode::OUTPUT_IMAGE_PNG,
'imageBase64' => false,
]);
$qrcode = new QRCode($options);
$imageData = $qrcode->render($text);
return [
'headers' => ['Content-Type' => 'image/png'],
'statusCode' => 200,
'body' => base64_encode($imageData),
'isBase64Encoded' => true,
];
}
}
return new QrGenerator();
Деплой на AWS Lambda через Bref
Установите Bref CLI и выполните:
composer require bref/bref
./vendor/bin/bref init
./vendor/bin/bref deploy
Всё. Через минуту у вас будет HTTPS-эндпоинт, который scale-ится автоматически. Стоимость — копейки (первые миллион запросов бесплатно).
Альтернативы AWS Lambda для PHP
AWS Lambda — лидер, но не единственный вариант. Рассмотрим аналоги, которые могут быть удобнее или дешевле.
1. OpenFaaS (Self-hosted)
Если вы не хотите привязываться к AWS, поставьте OpenFaaS на свой Kubernetes или Docker. Он поддерживает PHP через шаблоны. Пример функции:
# stack.yml
functions:
hello:
lang: php7
handler: ./hello
image: myuser/hello-php
В папке hello лежит index.php:
<?php
function handle(array $request): array {
return [
'status' => 200,
'body' => 'Hello from OpenFaaS!',
];
}
2. Google Cloud Functions (с адаптером)
Нативный PHP не поддерживается, но можно использовать Google Cloud Run (контейнеры). Упакуйте PHP-приложение в Docker-образ с Bref-рантаймом — получите serverless-окружение с автоподъёмом.
3. Vercel (для легковесных проектов)
Vercel поддерживает PHP через Serverless Functions. Ограничение: время выполнения до 60 секунд. Подходит для вебхуков и простых форм.
// api/submit.php
<?php
header('Content-Type: application/json');
$data = json_decode(file_get_contents('php://input'), true);
echo json_encode(['received' => $data['email']]);
4. Cloudflare Workers (с эмуляцией)
Напрямую PHP не поддерживается, но можно использовать WebAssembly или PHP-транспайлеры. Для production пока рано, но экспериментировать интересно.
Когда Serverless PHP — не лучший выбор?
Честно скажем: не всё блестит. Serverless на PHP имеет ограничения:
- Длительные задачи — Lambda живёт максимум 15 минут. Крон-скрипты не подойдут.
- Горячие старты — если функция вызывается редко, задержка "холодного старта" может быть 1-2 секунды.
- Библиотеки с нативным кодом — расширения вроде
imagickилиgdтребуют дополнительных слоёв.
Но для 90% задач — вебхуки, асинхронная обработка, API — это идеальный вариант.
Совет: комбинируйте с очередями
Для тяжёлых задач используйте SQS (или RabbitMQ