FrankenPHP 1.3 : Améliorations de Performance, Mode Watcher, Métriques Prometheus, et bien plus !
Publié le 13 novembre 2024
Nous avons le plaisir de vous annoncer la sortie de FrankenPHP 1.3, juste à temps pour la SyliusCon, une conférence durant laquelle nous venons de présenter cette nouvelle version. Avant de commencer cet article, nous aimerions remercier infiniment tous les contributeurs, et en particulier Alexander Stecher et Rob Landers, les deux autres mainteneurs du projet, qui ont réalisé un travail titanesque. De nombreux changements ont été apportés dans cette version 1.3, qui contient de nouvelles fonctionnalités, des corrections de bugs, ainsi qu’une refactorisation majeure qui améliore encore considérablement les performances de FrankenPHP. Découvrons dès maintenant ces nouveautés.
Une version deux fois plus efficace que la précédente
Alexander a procédé à une refonte majeure de notre moteur de threads et optimisé la création de la superglobale $_SERVER
. Les résultats parlent d’eux-mêmes : selon nos benchmarks, lorsqu’elle est correctement configurée et optimisée, la version 1.3 peut gérer 54% de requêtes supplémentaires avec le même matériel que la version 1.2.5 (qui était déjà bien plus efficace que les installations PHP conventionnelles) !
Ces changements sont transparents pour les utilisateurs finaux de FrankenPHP. Si vous êtes intéressé·e par les modifications apportées au code Go, consultez la section « Performance Improvements » du changelog.
Sachez aussi que ce n'est pas la fin des améliorations de performances : d'autres optimisations sont en cours d’implémentation, certaines sont déjà prêtes et arriveront très prochainement dans la future version 1.3.1.
Le mode watcher
FrankenPHP 1.3 inclut une nouvelle fonctionnalité dédiée à l'expérience développeur (DX) : le mode watcher.
Vous pouvez désormais spécifier une liste de fichiers (scripts PHP, templates, fichiers de configuration…) que FrankenPHP surveillera : lorsque l’un de ces fichiers est modifié, le worker sera automatiquement redémarré en arrière-plan. Plus besoin de redémarrer le serveur manuellement, il suffit d'appuyer sur le bouton « actualiser » de votre navigateur (ou encore mieux, d’utiliser le Hot Module Reloading si votre framework le supporte).
Pour cela, après avoir testé plusieurs solutions, nous avons choisi d’utiliser la toute nouvelle bibliothèque e-dant/watcher, qui fonctionne sur toutes les plateformes. Elle permet à FrankenPHP de surveiller des répertoires contenant des milliers de fichiers sans ralentissement. Merci à Will pour son aide à l'intégration de cette bibliothèque.
Pour activer cette fonctionnalité, ajoutez simplement la nouvelle directive watch à la configuration de votre worker :
<code class=""><pre class="wp-block-code"><code class="">{
frankenphp {
worker {
file /path/to/app/public/worker.php
watch
}
}
}</code></pre></code>
Le modèle par défaut fonctionnera avec les frameworks populaires tels que Laravel, Symfony et API Platform.
Cette nouvelle fonctionnalité a également un effet secondaire intéressant pour les projets basés sur Symfony, et d'autres projets compilant des fichiers : cela se fera instantanément et en arrière-plan lorsqu'un fichier est modifié, améliorant encore l'expérience développeur.
Il est également possible de configurer explicitement les fichiers à surveiller :
{
frankenphp {
worker {
file /path/to/app/public/worker.php
watch /path/to/app # watches all files in all subdirectories of /path/to/app
watch /path/to/app/*.php # watches files ending in .php in /path/to/app
watch /path/to/app/**/*.php # watches PHP files in /path/to/app and subdirectories
watch /path/to/app/**/*.{php,twig} # watches PHP and Twig files in /path/to/app and subdirectories
}
}
}
Lisez la documentation pour en savoir plus.
Nouvelles Métriques Prometheus
Puisque FrankenPHP se base sur Caddy, il dispose d’un endpoint Prometheus/OpenMetrics depuis sa première version. La version 1.3 introduit de nouvelles métriques dédiées aux threads et workers de FrankenPHP :
- frankenphp_busy_threads : affiche les threads PHP actuellement occupés à traiter des scripts PHP (y compris les workers en attente de requêtes).
- frankenphp_total_threads : affiche le nombre total de threads PHP en cours d'exécution.
- frankenphp_[worker]_busy_workers : montre combien de workers sont actuellement occupés à traiter des requêtes.
- frankenphp_[worker]_total_workers : montre le nombre total de workers.
- frankenphp_[worker]_worker_request_count : montre le total des requêtes traitées par chaque worker.
- frankenphp_[worker]_worker_request_time : montre le temps total pris pour traiter les requêtes.
Ces nouvelles métriques peuvent être surveillées pour l’autoscaling, ainsi que pour ajuster la configuration de FrankenPHP afin d’obtenir les meilleures performances possibles.
Un immense merci à Rob Landers pour cette contribution !
Gestion des échecs de Worker
Autre contribution de Rob : des erreurs plus explicites s'afficheront désormais lorsqu'un script de worker plante, et FrankenPHP essayera désormais de "réparer" automatiquement le worker lorsque c'est possible.
Mercure 0.17
FrankenPHP 1.3 inclut la toute nouvelle version de Mercure, le protocole de référence le plus simple pour pousser des données en temps réel depuis vos applications PHP directement vers le navigateur de vos utilisateurs.
Script d'Installation en une Ligne
Grâce à Pulkit Kathuria, il est désormais possible d'installer les binaires statiques de FrankenPHP (qui incluent PHP et de nombreuses extensions) en utilisant une seule commande :
curl https://frankenphp.dev/install.sh | sh
D'ailleurs, le binaire statique inclut désormais ext-parallel, le compagnon idéal de FrankenPHP pour développer des scripts PHP qui exécutent des fonctions en parallèle.
<?php
$runtime = new \parallel\Runtime();
$future = $runtime->run(function(){
for ($i = 0; $i < 500; $i++)
echo "*";
return "easy";
});
for ($i = 0; $i < 500; $i++) {
echo ".";
}
printf("\nparallel programming is %s\n", $future->value());
Correction de bugs
Enfin, la version 1.3 contient un ensemble de correctifs, notamment pour éviter les plantages liés à l'utilisation de certaines méthodes systèmes ou de la fonction putenv(). FrankenPHP prend désormais également en charge FreeBSD. Consultez le changelog pour plus de détails.
Vous accompagner avec FrankenPHP
Dites-nous ce que vous pensez de cette nouvelle version ! Notre coopérative est en mesure de vous accompagner dans l’optimisation des performances de votre application ou de vos déploiements avec FrankenPHP. Prenez contact avec nous dès à présent pour nous présenter vos problématiques, nous sommes à vos côtés pour identifier les solutions les plus pertinentes pour votre projet.