Funções Serverless em PHP: AWS Lambda Nível Avançado

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Funções Serverless em PHP: AWS Lambda — da teoria à prática avançada

\n\n

A arquitetura Serverless deixou de ser exótica há muito tempo, e o PHP, graças a ferramentas como Bref e Laravel Vapor, conquistou com confiança seu espaço no mundo da computação sem servidor. Neste artigo, abordaremos técnicas avançadas de trabalho com AWS Lambda em PHP: como vencer o cold start, configurar o trabalho dentro de uma VPC e processar eficientemente eventos do S3 e SQS. O material é voltado para desenvolvedores que já conhecem os fundamentos do deploy de aplicações PHP no Lambda.

\n\n

1. Otimização do cold start: de 2 segundos para 200 milissegundos

\n\n

O maior inimigo das aplicações serverless em PHP é o cold start. Ao contrário de Node.js ou Python, o PHP requer o carregamento do interpretador e do framework. Veja como minimizar as latências.

\n\n

1.1. Uso do Bref e de camadas pré-compiladas

\n\n

Bref é o padrão de facto para executar PHP no Lambda. Ele fornece camadas (Layers) prontas com o interpretador PHP. Para acelerar, use bref/extra-php-extensions e inclua apenas as extensões necessárias.

\n\n

Exemplo de configuração básica do serverless.yml:

\n
service: my-php-app\n\nprovider:\n  name: aws\n  runtime: provided.al2\n  region: eu-central-1\n\nplugins:\n  - ./vendor/bref/bref\n\nfunctions:\n  api:\n    handler: public/index.php\n    layers:\n      - ${bref:layer.php-81}\n    events:\n      - httpApi: '*'\n
\n\n

1.2. Carregamento preguiçoso e cache de configurações

\n\n

Não carregue todo o framework (Laravel, Symfony) a cada requisição. Use Laravel Octane com Swoole ou RoadRunner, mas para Lambda é mais adequado o Bref Laravel Bridge, que armazena em cache as configurações e rotas.

\n\n

Código para cache de configuração no bootstrap.php:

\n
// public/index.php (ponto de entrada para Lambda)\nrequire_once __DIR__ . '/../vendor/autoload.php';\n\n$app = require_once __DIR__ . '/../bootstrap/app.php';\n\n// Armazena a configuração em cache na primeira execução\nif (! file_exists(__DIR__ . '/../bootstrap/cache/config.php')) {\n    $app->make('config')->get('app');\n    // Salva a configuração compilada\n    file_put_contents(\n        __DIR__ . '/../bootstrap/cache/config.php',\n        '<?php return ' . var_export($app->make('config')->all(), true) . ';'\n    );\n} else {\n    $config = require __DIR__ . '/../bootstrap/cache/config.php';\n    $app->instance('config', $config);\n}\n\n$kernel = $app->make(Illuminate\\Contracts\\Http\\Kernel::class);\n$response = $kernel->handle(\n    $request = Illuminate\\Http\\Request::capture()\n);\n$response->send();\n$kernel->terminate($request, $response);\n
\n\n

Dica: Defina memorySize como 1024 MB e timeout como 30 segundos para equilibrar velocidade e custo. Mais memória significa CPU mais rápida.

\n\n

2. Trabalho com VPC: conexão ao RDS e ElastiCache

\n\n

As funções Lambda, por padrão, operam fora da sua VPC. Para acessar bancos de dados (RDS, Aurora) ou cache (ElastiCache), é necessário colocar a função dentro da VPC. Isso adiciona complexidade e aumenta o cold start em 5 a 10 segundos.

\n\n

2.1. Configuração de VPC no serverless.yml

\n\n
functions:\n  processUser:\n    handler: src/handlers/userHandler.php\n    layers:\n      - ${bref:layer.php-81}\n    vpc:\n      securityGroupIds:\n        - sg-0123456789abcdef0\n      subnetIds:\n        - subnet-abc123\n        - subnet-def456\n    events:\n      - sqs:\n          arn: arn:aws:sqs:eu-central-1:123456789012:user-queue\n
\n\n

2.2. Gerenciamento de conexões via PDO

\n\n

Use o pool de conexões RDS Proxy ou ElastiCache para reutilizar conexões dentro de um mesmo contêiner Lambda.

\n\n

Exemplo de classe para trabalhar com banco de dados com reutilização

Blogs

Book Recommendations