Le blog

FrankenPHP 1.11 : hot reload, logs structurés et performances améliorées

Publié le 19 janvier 2026

FrankenPHP 1.11 est disponible depuis fin décembre. Cette nouvelle version apporte une amélioration significative de la DX (hot reload) et renforce encore davantage l’intégration entre PHP et l’écosystème Go. Elle introduit plusieurs fonctionnalités majeures ainsi que des optimisations de performance notables. Découvrons-les ensemble dans cet article (dont la version originale, en anglais, a été publiée le 24 décembre dernier).

FrankenPHP et le Hot Reload" class="wp-image-12217#

Hot Reload natif

Il s’agit de l’une des fonctionnalités les plus demandées par la communauté. FrankenPHP 1.11 introduit un mécanisme de hot reload natif, conçu pour améliorer considérablement le workflow de développement. Ce système offre une expérience comparable au Hot Module Replacement (HMR) des outils JavaScript modernes. Lorsqu’un fichier PHP (ou un template, ou un asset) est modifié, FrankenPHP détecte automatiquement le changement et met à jour le navigateur en temps réel, sans rechargement manuel.

Cette fonctionnalité repose sur le hub Mercure intégré à FrankenPHP, qui permet de propager instantanément les mises à jour. Une bibliothèque JavaScript dédiée, basée sur Idiomorph, applique intelligemment les changements au DOM, tout en conservant la position de défilement et l’état des formulaires. Le hot reload fonctionne nativement avec WordPress (présenté dans la vidéo), Laravel, Symfony, ainsi qu’avec la quasi-totalité des applications PHP. Voyons sa mise en œuvre :

Activez l’option hot_reload dans le fichier Caddyfile

⚠️ Attention : cette fonctionnalité expose des détails interne de l’application et entraîne une surcharge liée à la surveillance du système de fichiers. Elle ne doit jamais être activée en production.

localhost

# Enable the built-in Mercure hub
mercure {
    anonymous
}

root public/
php_server {
    # Enable the hot reload feature
    hot_reload
}

Pour une expérience optimale, lorsque l’application ou le framework supporte le mode worker, il est recommandé de le combiner avec la directive worker.watch. Cela permet de redémarrer automatiquement le worker tout en mettant à jour le navigateur simultanément :

localhost

mercure {
    anonymous
}

root public/
php_server {
    hot_reload

    worker {
        file /path/to/my_worker.php
        watch
    }
}

Côté client, il suffit d’ajouter les bibliothèques JavaScript nécessaires ainsi qu’un élément meta dans le layout. L’URL Mercure est automatiquement exposée via la variable $_SERVER['FRANKENPHP_HOT_RELOAD'].

<!DOCTYPE html>
<title>FrankenPHP Hot Reload</title>
<?php if (isset($_SERVER['FRANKENPHP_HOT_RELOAD'])): ?>
<meta name="frankenphp-hot-reload:url" content="<?=$_SERVER['FRANKENPHP_HOT_RELOAD']?>">
<script src="https://cdn.jsdelivr.net/npm/idiomorph"></script>
<script src="https://cdn.jsdelivr.net/npm/frankenphp-hot-reload/+esm" type="module"></script>
<?php endif ?>
#

Journalisation structurée avec frankenphp_log()

L’observabilité est un enjeu central des applications modernes. Go a récemment introduit une journalisation structurée standardisée via le package log/slog. FrankenPHP expose désormais cette capacité directement à PHP.

La nouvelle fonction frankenphp_log() permet d’émettre des logs structurés depuis le code PHP. Cette approche est particulièrement adaptée aux environnements de production : les logs PHP sont désormais alignés avec ceux de Caddy, facilitant leur ingestion dans des plateformes comme Datadog, Grafana Loki, Elastic, ainsi que leur exploitation via OpenTelemetry.

<?php

frankenphp_log(
    message: "User logged in",
    level: FRANKENPHP_LOG_LEVEL_INFO, // FRANKENPHP_LOG_LEVEL_DEBUG, FRANKENPHP_LOG_LEVEL_INFO, FRANKENPHP_LOG_LEVEL_WARN, or FRANKENPHP_LOG_LEVEL_ERROR, defaults to FRANKENPHP_LOG_LEVEL_INFO
    context: [
        "user_id" => 123,
        "ip" => $_SERVER['REMOTE_ADDR']
    ]
);

Par défaut, Caddy produisant des logs JSON structurés, cet appel génère une entrée standardisée sur la sortie standard :

{"level":"info","ts":1703690000.123,"logger":"frankenphp","msg":"User logged in","user_id":123,"ip":"192.168.1.1"}

La journalisation peut être entièrement personnalisée via la configuration de Caddy.

#

Améliorations de performance

FrankenPHP est déjà reconnu pour ses performances, mais cette version vise à aller encore plus loin.

Grâce à des benchmarks approfondis (réalisés avec l’aide de Tideways), plusieurs goulots d’étranglement ont été identifiés et corrigés dans des scénarios de charge très élevée. Ces optimisations améliorent le débit global dans les cas extrêmes et, surtout, réduisent significativement la latence de queue (p95 et p99), garantissant un comportement plus stable sous forte charge.

Les performances liées à l’utilisation de certains en-têtes HTTP peu courants ont également été améliorées via la mise à jour vers la version 2 de la bibliothèque Otter.

Selon nos benchmarks, FrankenPHP surpasse désormais PHP-FPM même sans activer le mode worker.

#

À vos côtés pour vos projets FrankenPHP

En tant que créateurs de FrankenPHP et d’API Platform, nous aidons les entreprises à tirer le meilleur de l’écosystème PHP grâce à des solutions sur mesure : développement, conseil, formation, audits, infrastructure, hébergement… Voici comment nous pouvons vous accompagner :

  • Migration et modernisation : passez d’Apache, Nginx ou PHP-FPM à FrankenPHP et Caddy, et transformez votre application en binaire autonome pour les environnements contraints.
  • Nous renforçons vos équipes et vos compétences grâce à l’intervention de nos développeurs expérimentés et nos formations sur mesure.
  • Nous sécurisons et fiabilisons vos projets avec des audits clairs sur la qualité, la sécurité et la réduction de la dette technique.
  • Nous concevons la bonne architecture grâce à des ateliers collaboratifs sur vos besoins métier, la conception logicielle, la stack technologique et les bonnes pratiques d’industrialisation.
  • Enfin, nous créons aussi vos APIs web performantes REST ou GraphQL facilement avec API Platform, notre framework PHP reconnu.

Besoin d’un accompagnement sur l’un de ces sujets ? Contactez notre équipe dès maintenant !

Le blog

Pour aller plus loin