Serverless на PHP: AWS Lambda и альтернативы для бэкенда без сервера

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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

Блоги

Рекомендаций по книгам