PHP et Serverless : une alliance inattendue
\n\nQuand on entend « Serverless » (ou « calcul sans serveur »), la première association qui vient à l'esprit, c'est JavaScript, Python ou Go. PHP dans ce contexte semble être un « dinosaure » coincé à l'époque des hébergements mutualisés et des WordPress monolithiques. Mais regardons la vérité en face : PHP est vivant, en bonne santé et plus flexible que vous ne le pensez.
\n\nAujourd'hui, nous allons voir comment exécuter du code PHP dans AWS Lambda et ses alternatives. Vous découvrirez pourquoi le PHP serverless n'est pas de la magie, mais un outil de travail pour les API, les gestionnaires de webhooks et les microservices. Spoiler : vous n'aurez pas à abandonner votre langage préféré.
\n\nQu'est-ce que le Serverless en réalité ?
\n\nDissipons tout de suite le mythe. « Serverless » ne signifie pas « sans serveur ». Cela signifie que vous ne pensez pas au serveur. La plateforme (AWS, Google Cloud, Vercel) gère elle-même l'infrastructure : mise à l'échelle, mises à jour, réparations. Vous téléchargez simplement votre code et payez pour le temps d'exécution.
\n\nPour PHP, cela ressemble à un défi. En effet, PHP nécessite traditionnellement un serveur web (Apache, Nginx) et le module PHP-FPM. Mais les technologies ne restent pas figées.
\n\nComment PHP fonctionne-t-il dans un environnement sans serveur ?
\n\nLe problème clé : les fonctions Lambda (et leurs équivalents) sont des conteneurs sans état (stateless) qui vivent quelques secondes ou minutes. Ils ne « conservent » pas de session en mémoire, ne font pas tourner Apache. Par conséquent, un script PHP standard qui attend $_GET ou écrit dans $_SESSION doit être adapté.
La solution est venue sous la forme d'exécutions spécialisées (runtimes). Ils transforment un événement Lambda (par exemple, une requête HTTP d'API Gateway) en un contexte PHP familier. L'outil le plus populaire pour cela est Bref.
\n\nBref : le moteur PHP pour AWS Lambda
\n\nBref est un projet open-source qui permet d'exécuter PHP sur AWS Lambda « prêt à l'emploi ». Il est livré avec des couches (layers) prêtes à l'emploi qui incluent PHP 8.x et des extensions populaires (PDO, Redis, gd, mbstring).
\n\nInstallation et premier lancement
\n\nPour travailler, vous aurez besoin de :
\n- \n
- Un compte AWS \n
composeretaws-cliinstallés \n - Node.js (pour Serverless Framework) \n
Créons une fonction simple qui renvoie un JSON avec l'heure actuelle :
\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\nConfigurons maintenant le déploiement. Créez un fichier 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\nLancez le déploiement :
\ncomposer require bref/bref\nserverless deploy\n\nDans une minute, vous obtiendrez une URL du type : https://xxx.execute-api.eu-central-1.amazonaws.com/time. Ouvrez-la dans votre navigateur — vous verrez du JSON. Félicitations, vous venez de lancer une fonction PHP serverless sur AWS Lambda !
Alternatives à AWS Lambda pour PHP
\n\nVous ne voulez pas vous lier à AWS ? Il existe des alternatives qui s'entendent aussi avec PHP.
\n\nGoogle Cloud Functions (avec adaptation)
\n\nGoogle ne supporte pas PHP nativement, mais vous pouvez