FrankenPHP : un serveur d’applications PHP moderne
(frankenphp.dev)- Dans les flux de déploiement visant à lancer des apps PHP sans PHP-FPM séparé, FrankenPHP est un serveur d’applications basé sur Go qui intègre l’exécuteur PHP officiel à Caddy, afin d’exécuter des apps web PHP et des scripts CLI avec une seule commande
- HTTP/1.1, HTTP/2, HTTP/3, certificats HTTPS automatiques, compression Brotli/Zstandard/Gzip, journalisation structurée et métriques Prometheus sont regroupés parmi les fonctionnalités de base, ce qui réduit la configuration serveur
- Le Worker mode démarre l’application une fois et la conserve en mémoire ; selon ses propres benchmarks sur une app API Platform, il serait 3,5 fois plus rapide que FPM
- Compatible avec PHP 8.2+, la plupart des extensions PHP et les modules Caddy, il prend aussi en charge nativement des extensions populaires comme OPcache et XDebug
- La prise en charge des images Docker, de Kubernetes, des plateformes cloud et du déploiement sous forme de binaire statique autonome peut simplifier l’unité de déploiement des apps PHP
Mode d’exécution et flux d’utilisation de base
- FrankenPHP se présente comme un serveur d’applications PHP moderne écrit en Go, avec une installation et une exécution d’apps PHP centrées sur une seule commande
- Les exemples d’installation sont répartis par système d’exploitation
- Linux/macOS :
curl https://frankenphp.dev/install.sh | sh - Windows PowerShell :
irm https://frankenphp.dev/install.ps1 | iex
- Linux/macOS :
- L’exécution locale couvre à la fois le serveur web et la CLI
frankenphp php-server -r public/: servir le répertoirepublic/frankenphp php-cli script.php: exécuter un script PHP en ligne de commande
- L’exécution avec Docker utilise aussi la même image
- Servir le répertoire
public/avec l’imagedunglas/frankenphp - Possibilité d’exécuter des scripts CLI comme
php script.phpdepuis la même image
- Servir le répertoire
- La configuration est basée sur Caddy ; l’exemple de configuration active la compression dans un bloc
localhostet traite les fichiers PHP et les assets statiques du répertoire courant avecphp_server
Fonctionnalités serveur et compatibilité PHP
-
Fonctionnalités de serveur web
- Intègre l’exécuteur PHP officiel à Caddy
- Prise en charge native de HTTP/1.1, HTTP/2 et HTTP/3
- Automatise la création, le renouvellement et la révocation des certificats HTTPS via Let’s Encrypt ou ZeroSSL
- Prise en charge intégrée de la compression Brotli, Zstandard et Gzip
- Inclut la journalisation structurée et la prise en charge de Prometheus
-
Environnement d’exécution PHP
- Compatible avec PHP 8.2+, la plupart des extensions PHP et tous les modules Caddy
- Prend en charge nativement les extensions PHP populaires, dont OPcache et XDebug
- Ne nécessite pas PHP-FPM et utilise sa propre SAPI conçue pour le serveur web Go
Worker mode et fonctionnalités orientées performance
- Le Worker mode démarre l’application une fois puis la conserve en mémoire, afin qu’elle soit prête à traiter les requêtes en quelques millisecondes
- Pris en charge nativement par Symfony, API Platform et Laravel
- Utilise les superglobales PHP existantes, sans PSR-7
- Même si l’application n’est pas compatible avec le Worker mode, elle peut être servie telle quelle
- Fournit un watcher qui redémarre automatiquement les workers lors des changements de code
- Présenté comme 3,5 fois plus rapide que FPM dans ses propres benchmarks sur une app API Platform
Déploiement et packaging
- Possibilité de déployer des apps cloud native avec des images Docker
- Compatible avec Kubernetes et les plateformes cloud modernes
- Possibilité de packager des applications web PHP et des outils en ligne de commande sous forme de binaire statique autonome
- Décrit comme fonctionnant avec un seul service et un seul binaire, sans service externe nécessaire
Fonctionnalités web supplémentaires
- Prend en charge les 103 Early Hints, présentés sur la base d’un article de Cloudflare comme une fonctionnalité pouvant améliorer le temps de chargement des sites web de 30 %
- Grâce au hub Mercure intégré, les apps PHP peuvent envoyer des événements aux navigateurs connectés, qui reçoivent immédiatement la charge utile sous forme d’événements JavaScript
- Prend en charge les déploiements sans interruption avec le graceful reload
1 commentaires
Avis sur Hacker News
Le personnage d’éléphant façon Frankenstein est bizarre, moche et mignon à la fois. Le design, les couleurs, les textes et les animations sont aussi soignés. Pour quelqu’un qui s’est éloigné du développement PHP depuis un moment, la proposition de valeur ressort bien, et ça semble adapté pour démarrer rapidement quelque chose de petit
Je n’ai pas envie de lancer 8 conteneurs pour isoler des logiciels médiocres ou des dépendances emberlificotées. Je n’aime pas l’idée d’emballer un « ça marche sur ma machine » et de le balancer au monde au lieu de fournir un logiciel installable. Par nostalgie, je pourrais y jeter un œil, mais je ne suis pas sûr d’avoir encore envie de mettre ce genre de chose en production
Le langage devrait aller dans cette direction, plutôt que vers l’approche à l’ancienne de LAMP, avec une configuration Apache un peu complexe
Je compte aussi essayer celui-ci, mais je n’ai jamais rencontré de goulot d’étranglement avec nginx ou Apache. Dans les deux cas, on les lance en quelques minutes tout au plus
Il s’exécute comme un service unique, à la manière d’Apache + mod_php, gère le multiprocessing pour PHP et d’autres langages, les fichiers statiques et le reverse proxy, et permet de piloter à la fois lui-même et PHP dans une seule configuration, à l’exécution, via un fichier ou un socket : https://unit.nginx.org/configuration/#php
Un exemple de configuration réelle se trouve ici : https://github.com/PrivateBin/docker-unit-alpine/blob/master..., et l’image de conteneur obtenue peut aussi rester assez petite : https://hub.docker.com/r/privatebin/unit-alpine
À part redémarrer Apache, je ne me souviens pas avoir eu grand-chose d’autre à faire
C’est à peu près
LoadModule proxy_fcgi_module "/usr/lib/apache2/modules/mod_proxy_fcgi.so"etSetHandler "proxy:fcgi://127.0.0.1:9000". Il y a aussi un exemple Nginx conceptuellement similaire à la façon de configurer Apache, avec même l’installation des paquets nécessaires : https://news.ycombinator.com/item?id=37443911Il existe aussi des images de conteneur préconstruites qui donnent un résultat similaire, mais si l’on veut voir comment ça fonctionne en interne, on peut le faire soi-même. C’est clairement plus simple que de configurer manuellement Tomcat ou GlassFish sur les anciens serveurs d’applications Java, et même si une commande d’exécution unique est préférable dans n’importe quel environnement, LAMP n’est pas si mauvais par rapport à d’autres stacks
Avec un binaire, il devient aussi plus facile de l’intégrer dans une app Electron
php -S 0.0.0.0:8000 public/index.phpMais il est monothread et lent, donc pas fait pour la production. FrankenPHP semble prometteur, mais le problème de limite de cœurs/threads[2] pourrait aussi poser souci en production. Cela dit, je pourrais l’essayer sur le projet pure-todo[1] pour voir s’il y a le même problème. L’image Docker par défaut a l’air assez bonne
1 : https://github.com/sandreas/pure-todo
2 : https://github.com/dunglas/frankenphp/discussions/294
Voir l’avertissement en haut de page : https://www.php.net/manual/en/features.commandline.webserver...
Je ne suis pas sûr que ce soit vraiment une comparaison équitable dans ce contexte
PHP_CLI_SERVER_WORKERS, on peut l’exécuter avec plusieurs threadsPour un petit site avec peu d’utilisateurs, j’aimerais savoir ce qu’on perd par rapport à d’autres environnements « prêts pour la production »
On dit qu’il est prêt pour la production en quelques commandes et 3,5 fois plus rapide que FPM, mais dans mon environnement il tournait à environ 1 % des performances de FPM. J’ai aussi essayé l’exécutable, avec le même problème, et pour un hello world j’aurais attendu au moins 200K rps
Dans la plupart des benchmarks, quand le mode worker est activé, FrankenPHP est généralement bien plus rapide que FPM, environ 3 fois plus. Il existe toutefois quelques exceptions, que nous corrigeons avec les mainteneurs de PHP.
C’est assez étrange, car Caddy lui-même offre de très bonnes performances lorsqu’il est utilisé avec PHP.
Pour l’instant, il est tout en bas avec la mention did not complete.
Il y a un problème de performance. En dehors de cela, c’est un projet vraiment prometteur.
Cela dit, je n’ai pas creusé en profondeur, et les tests ont été faits dans Docker plutôt que dans une configuration classique. WordPress était aussi quasiment en configuration par défaut, sans thème lourd, donc les conditions n’étaient pas réalistes. J’aimerais quand même refaire les tests et mieux comprendre.
En revanche, 103 Early Hints permet de précharger les assets et de réduire la latence de chargement des pages de 30 %. FrankenPHP facilite aussi l’activation du cache HTTP avec WordPress et simplifie le déploiement. Il existe également un projet dédié à WordPress et FrankenPHP, avec un cache HTTP intégré adapté à WordPress utilisant la bibliothèque Go Souin : https://github.com/StephenMiracle/frankenwp
Cela permet d’économiser un peu de mémoire côté Apache et de laisser plus de marge pour traiter davantage de requêtes PHP.
docker run -v $PWD:/app/public -p 443:443 \ dunglas/frankenphpSi vous voulez créer vous-même un conteneur Docker pour servir l’application, les commandes suivantes semblent suffisantes pour transformer un Debian fraîchement installé en conteneur nécessaire :
apt install -y apache2 libapache2-mod-phpet la configuration de/etc/apache2/sites-enabled/000-default.conf.Avec des amis, nous maintenons un dépôt qui montre comment passer de zéro à une application web en cours d’exécution avec plusieurs langages et frameworks populaires : https://github.com/no-gravity/web_app_from_scratch
Chaque fois que j’active xdebug, je dois redémarrer Apache après la session de débogage. Depuis hier, j’ai commencé à configurer apache2 pour utiliser php-fpm, et je me demande si ce FrankenPHP pourrait nous convenir, au moins pour l’environnement de développement. Cela dit, je n’ai pas trouvé dans la documentation comment installer des extensions PHP.
000-default.confpar défaut redirige-t-il 443 vers 80 ?FPM et son architecture sans partage ont été essentiels au succès de PHP il y a longtemps, mais j’ai aussi l’impression qu’ils sont devenus ses chaînes.