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, лимиты памяти), правильная архитектура и