PHP y Serverless: una alianza inesperada
\n\nCuando escuchamos «Serverless» (o «computación sin servidor»), la primera asociación es JavaScript, Python o Go. PHP en este contexto parece un «dinosaurio» atrapado en la era de los alojamientos compartidos y los WordPress monolíticos. Pero seamos realistas: PHP está vivo, sano y es más flexible de lo que piensas.
\n\nHoy analizaremos cómo ejecutar código PHP en AWS Lambda y sus alternativas. Descubrirás por qué PHP serverless no es magia, sino una herramienta funcional para APIs, manejadores de webhooks y microservicios. Spoiler: no tendrás que renunciar a tu lenguaje favorito.
\n\n¿Qué es realmente Serverless?
\n\nDespejemos el mito de inmediato. «Serverless» no significa «sin servidor». Significa que no piensas en el servidor. La plataforma (AWS, Google Cloud, Vercel) gestiona la infraestructura por ti: escala, actualiza, repara. Tú solo subes el código y pagas por el tiempo de ejecución.
\n\nPara PHP, esto suena a desafío. PHP tradicionalmente requiere un servidor web (Apache, Nginx) y el módulo PHP-FPM. Pero la tecnología no se detiene.
\n\n¿Cómo funciona PHP en un entorno sin servidor?
\n\nEl problema clave: las funciones Lambda (y sus equivalentes) son contenedores stateless que viven unos segundos o minutos. No «mantienen» una sesión en memoria, no ejecutan Apache. Por lo tanto, un script PHP estándar que espera $_GET o escribe en $_SESSION debe adaptarse.
La solución llegó en forma de runtimes especiales. Convierten un evento Lambda (por ejemplo, una solicitud HTTP de API Gateway) en un contexto PHP familiar. La herramienta más popular para esto es Bref.
\n\nBref: el motor PHP para AWS Lambda
\n\nBref es un proyecto de código abierto que permite ejecutar PHP en AWS Lambda «listo para usar». Viene con capas (layers) preconstruidas que incluyen PHP 8.x y extensiones populares (PDO, Redis, gd, mbstring).
\n\nInstalación y primer lanzamiento
\n\nPara trabajar necesitarás:
\n- \n
- Una cuenta de AWS \n
composeryaws-cliinstalados \n - Node.js (para Serverless Framework) \n
Creemos una función simple que devuelva un JSON con la hora actual:
\n\n// index.php\n<?php\nrequire __DIR__ . '/vendor/autoload.php';\n\nuse Bref\\Context\\Context;\nuse Bref\\Event\\Http\\HttpHandler;\n\nclass TimeHandler extends HttpHandler\n{\n public function handleRequest($request, Context $context): array\n {\n return [\n 'statusCode' => 200,\n 'headers' => ['Content-Type' => 'application/json'],\n 'body' => json_encode([\n 'server_time' => date('Y-m-d H:i:s'),\n 'php_version' => PHP_VERSION,\n 'message' => 'Hello from Serverless PHP!'\n ]),\n ];\n }\n}\n\nreturn new TimeHandler();\n\nAhora configuremos el despliegue. Crea un archivo serverless.yml:
# serverless.yml\nservice: php-time-api\n\nprovider:\n name: aws\n region: eu-central-1\n runtime: provided.al2\n\nplugins:\n - ./vendor/bref/bref\n\nfunctions:\n api:\n handler: index.php\n timeout: 28\n layers:\n - ${bref:layer.php-81}\n events:\n - httpApi: 'GET /time'\n\nEjecuta el despliegue:
\ncomposer require bref/bref\nserverless deploy\n\nEn un minuto obtendrás una URL como: https://xxx.execute-api.eu-central-1.amazonaws.com/time. Ábrela en tu navegador y verás el JSON. Felicidades, ¡acabas de ejecutar una función PHP serverless en AWS Lambda!
Alternativas a AWS Lambda para PHP
\n\n¿No quieres atarte a AWS? Hay alternativas que también son compatibles con PHP.
\n\nGoogle Cloud Functions (con adaptación)
\n\nGoogle no admite PHP de forma nativa, pero puedes