Serverless функции на PHP: AWS Lambda — практическое руководство

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

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

Начать курс

Serverless функции на PHP: AWS Lambda — от теории к практике

Современная веб-разработка всё чаще отказывается от традиционных монолитных серверов в пользу облачных вычислений. Serverless-архитектура (или «бессерверная») позволяет разработчикам сосредоточиться исключительно на коде, не беспокоясь об управлении инфраструктурой. AWS Lambda — один из самых популярных сервисов для реализации такого подхода. Однако долгое время считалось, что PHP не подходит для serverless. Это миф. В этой статье мы разберём, как запускать PHP-функции на AWS Lambda, какие инструменты для этого нужны и как оптимизировать производительность.

Что такое AWS Lambda и как в него вписать PHP?

AWS Lambda — это вычислительный сервис, который запускает ваш код в ответ на события и автоматически управляет вычислительными ресурсами. Вы платите только за фактическое время выполнения и количество запросов. Lambda изначально поддерживает Node.js, Python, Java, Go и .NET, но PHP не входит в этот список «из коробки». Однако это не проблема: мы можем использовать пользовательские среды выполнения (Custom Runtime) или готовые обёртки, такие как Bref.

Bref — это opensource-проект, который предоставляет готовый Runtime для PHP на AWS Lambda, а также интеграцию с фреймворками (Laravel, Symfony). С его помощью вы можете писать обработчики событий, API-эндпоинты или даже полноценные веб-приложения, работающие в serverless-режиме.

Основные компоненты для запуска PHP на Lambda:

  • Bref Runtime — слой, содержащий PHP-интерпретатор и необходимые расширения.
  • Событие (Event) — триггер, запускающий функцию (HTTP-запрос, загрузка файла в S3, изменение в DynamoDB).
  • Обработчик (Handler) — PHP-функция или метод класса, который получает и обрабатывает событие.

Настройка окружения и первый пример

Для работы нам понадобится Composer, Docker (для сборки) и аккаунт AWS. Установим Bref:

composer require bref/bref

Bref использует Docker-образ для локального тестирования и сборки. После установки создадим файл serverless.yml — конфигурацию для деплоя на AWS Lambda.

Пример конфигурации serverless.yml:

service: my-php-function

provider:
  name: aws
  region: us-east-1
  runtime: provided.al2

plugins:
  - ./vendor/bref/bref

functions:
  hello:
    handler: index.php
    layers:
      - ${bref:layer.php-81}
    events:
      - httpApi: 'GET /hello'

Теперь напишем простейший обработчик — файл index.php:

<?php

require __DIR__ . '/vendor/autoload.php';

return function ($event) {
    $name = $event['queryStringParameters']['name'] ?? 'World';
    return [
        'statusCode' => 200,
        'body' => "Hello, $name!",
    ];
};

Этот код возвращает JSON-ответ с приветствием. Чтобы запустить локально, используем команду:

vendor/bin/bref local hello

Деплой и триггеры: от HTTP до S3

После локальной проверки можно развернуть функцию в облаке. Убедитесь, что у вас настроены credentials AWS (через AWS CLI или переменные окружения). Выполните:

serverless deploy

В консоли вы увидите URL вашего API Gateway (если настроен HTTP-триггер). Теперь можно обращаться к функции через браузер или curl.

Другие популярные триггеры для PHP-функций:

  • S3 Events — обработка загрузки/удаления файлов.
  • SQS/SNS — асинхронная обработка очередей сообщений.
  • CloudWatch Events — запуск по расписанию (cron).
  • DynamoDB Streams — реакция на изменения в базе данных.

Пример обработки события из S3 (файл process_image.php):

<?php

use Aws\S3\S3Client;

return function ($event) {
    $s3 = new S3Client(['region' => 'us-east-1', 'version' => 'latest']);
    foreach ($event['Records'] as $record) {
        $bucket = $record['s3']['bucket']['name'];
        $key = $record['s3']['object']['key'];
        // Логика обработки изображения
        echo "Processing s3://$bucket/$key\n";
    }
};

Оптимизация и ограничения PHP на Lambda

Хотя serverless упрощает масштабирование, есть нюансы, которые нужно учитывать при работе с PHP:

  • Cold start — первый запуск после простоя может занимать 1-3 секунды из-за загрузки слоя PHP. Используйте Provisioned Concurrency для критичных функций.
  • Лимиты выполнения — максимальное время выполнения функции — 15 минут. Для долгих задач используйте асинхронные вызовы.
  • Память — выбирайте объём памяти (от 128 МБ до 10 ГБ) пропорционально сложности задачи. CPU масштабируется вместе с памятью.
  • Статические файлы — не храните файлы на локальном диске Lambda (это эфемерное хранилище /tmp до 512 МБ). Используйте S3 или EFS.

Best practices для PHP-функций:

  • Минимизируйте зависимости Composer — удаляйте ненужные пакеты.
  • Кэшируйте соединения с БД или API внутри обработчика (используйте статические переменные).
  • Логируйте через CloudWatch — не пишите в файлы.
  • Используйте bref:layer.php-81 с PHP 8.1+ для лучшей производительности.

Заключение

Serverless-функции на PHP с AWS Lambda — это не только возможно, но и практично для микросервисов, API-шлюзов, обработки файлов и фоновых задач. С помощью Bref вы получаете полноценную среду выполнения, совместимую с популярными PHP-фреймворками. Несмотря на некоторые ограничения (cold start, лимиты памяти), правильная архитектура и

Блоги

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