Le blog

Sortie de FrankenPHP 1.5 et 1.6

Publié le 28 mai 2025

Les versions 1.5 et 1.6 de FrankenPHP, fraîchement publiées, introduisent de nombreuses fonctionnalités majeures et des correctifs qui améliorent significativement la simplicité d’utilisation et les performances du projet. Faisons ensemble un tour d’horizon des nouveautés ! La version originale de cet article (EN) est disponible sur le blog de Kévin Dunglas.

FrankenPHP 2 versions released" class="wp-image-11317#

Autoscaling des threads

Jusqu’à présent, il était nécessaire de définir de manière statique le nombre de threads utilisés par FrankenPHP pour traiter les requêtes PHP. Par défaut, FrankenPHP démarrait avec un nombre de threads équivalent à deux fois le nombre de cœurs CPU de la machine : une configuration souvent sous-optimale. Le nombre idéal de threads dépend fortement de votre application et de votre matériel. Une documentation détaillée est disponible pour vous aider à trouver la valeur la plus adaptée.

Dans la version 1.5, Alexander Stecher a ajouté une nouvelle fonctionnalité : l’autoscaling des threads. Avec ce mode, FrankenPHP peut créer automatiquement des threads supplémentaires à l’exécution, jusqu’à une limite définie. Cette nouvelle directive max_threads vous permet d’identifier plus facilement le nombre de threads nécessaires pour absorber votre trafic, et rend le serveur plus résilient face aux pics de latence. 

Si cette option est définie sur auto, la limite sera estimée automatiquement en fonction de la directive memory_limit de votre php.ini. Ce fonctionnement est similaire au paramètre pm.max_children de PHP-FPM comme le précise la documentation liée.

#

Temps d’attente maximal

Toujours grâce à Alexander, une nouvelle option permet désormais de limiter le temps durant lequel une requête peut patienter en file d’attente lorsqu’aucun thread PHP n’est disponible. Cela évite une accumulation infinie de requêtes lors des pics de charge.Une fois le max_wait_time atteint, FrankenPHP retournera une erreur 504 Gateway Timeout.

#

Binaires statiques hybrides (glibc)

L’une des fonctionnalités clés de FrankenPHP est qu’il peut être téléchargé sous forme de binaire entièrement statique, contenant tout ce qu’il faut pour fonctionner : FrankenPHP lui-même, un serveur web (Caddy), le moteur PHP, les extensions PHP les plus courantes, ainsi que toutes leurs dépendances.

Autrement dit, il suffit de télécharger un seul fichier exécutable pour faire tourner FrankenPHP, sans dépendance système à installer.

Ce binaire statique utilise la libc musl, mais PHP rencontre certains problèmes connus avec musl (notamment avec OpenSSL). De plus, musl peut être plus lente que la libc GNU dans certains cas.

L’outil static-php-cli, utilisé par FrankenPHP en interne pour générer ses builds statiques, prend désormais en charge la création de versions dites "presque statiques" de la bibliothèque PHP. Cela signifie que toutes les bibliothèques système nécessaires sont liées statiquement (elles n’ont donc pas besoin d’être installées sur la machine), à l’exception de la libc elle-même. Grâce à cette approche, FrankenPHP peut utiliser la libc GNU installée localement, disponible par défaut sur la plupart des distributions GNU/Linux populaires.

Depuis FrankenPHP 1.5, grâce à Jerry Ma et Marc “Henderkes” (également auteurs de cette amélioration dans static-php-cli), nous proposons des builds presque statiques de FrankenPHP directement téléchargeables depuis les releases GitHub (fichiers frankenphp-linux-<arch>-gnu).

En plus d’offrir de meilleures performances et une stabilité accrue, ces builds permettent également de charger des extensions PHP compilées dynamiquement, comme Xdebug ou FFI, incompatibles avec les builds basés sur musl.

#

Paquets Debian/Ubuntu et RedHat

Les builds presque statiques ont également permis d’ajouter une nouvelle fonctionnalité, elle aussi contribuée par Marc “Henderkes” : la génération de paquets officiels RPM et deb !

En plus des paquets Homebrew déjà disponibles, à partir de FrankenPHP 1.6, des paquets pour Debian/Ubuntu et RedHat sont désormais compilés automatiquement via la CI et publiés dans les releases GitHub.

Des dépôts de paquets seront mis en place à l’avenir (toute aide est bienvenue).

#

Workers spécifiques par site

Toujours grâce à Marc, FrankenPHP permet désormais de définir des workers PHP par site, et non plus uniquement globalement. Cela permet des configurations fines dans votre Caddyfile :

{
    frankenphp
}

one.example.com {
    php_server {
        root /var/www/app-one
        env APP_NAME one
        worker index.php 16 # 16 instances of the worker script will run in parallel
    }
}
two.example.com {
    root /var/www/app-two
    php_server {
        env APP_NAME two
        worker {
            file index.php
            num 8 # 8 instances of the worker script will run in parallel
        }
    }
}
#

Migration vers Caddy 2.10

FrankenPHP 1.6 s’appuie désormais sur Caddy 2.10, une version majeure intégrant de nombreuses nouveautés : Encrypted Client Hello, échange de clés post-quantique (PQC), support DNS global, etc.

#

Soutenez le projet !

Nous avons dévoilé la nouvelle il y a quelques jours : FrankenPHP est désormais officiellement soutenu par la PHP Foundation, en partenariat avec l’équipe de Caddy. 

De nombreux talks sur FrankenPHP sont également annoncés à l’API Platform Conference 2025, qui aura lieu en France les 18 et 19 septembre. Les principaux contributeurs seront présents, rejoignez-nous ! Vous pouvez également soutenir FrankenPHP en contribuant au projet, en lui attribuant une ⭐ sur GitHub, ou en faisant appel à notre équipe d’expert·es pour mieux le maîtriser ou vous accompagner sur vos problématiques de performance ou de migration.

Le blog

Pour aller plus loin