Funções Serverless em PHP: AWS Lambda — da teoria à prática avançada
\n\nA 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\n1. Otimização do cold start: de 2 segundos para 200 milissegundos
\n\nO 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\n1.1. Uso do Bref e de camadas pré-compiladas
\n\nBref é 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.
Exemplo de configuração básica do serverless.yml:
\nservice: 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\n1.2. Carregamento preguiçoso e cache de configurações
\n\nNã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\nCó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\nDica: Defina memorySize como 1024 MB e timeout como 30 segundos para equilibrar velocidade e custo. Mais memória significa CPU mais rápida.
2. Trabalho com VPC: conexão ao RDS e ElastiCache
\n\nAs 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\n2.1. Configuração de VPC no serverless.yml
\n\nfunctions:\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\n2.2. Gerenciamento de conexões via PDO
\n\nUse o pool de conexões RDS Proxy ou ElastiCache para reutilizar conexões dentro de um mesmo contêiner Lambda.
\n\nExemplo de classe para trabalhar com banco de dados com reutilização