PHP на серверах без сервера: AWS Lambda для веб-разработчиков

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

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

Начать курс

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 секунд. Если ваш скрипт работает д

Блоги

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