La parole est aux speakers : Kévin Dunglas

Publié le

Jusqu’au Forum PHP 2022, retrouvez nos interviews de speakers pour mieux comprendre leur parcours et le sujet qu’ils ou elles aborderont lors de leur conférence !

La conférence

FrankenPHP, dans les entrailles de l'interpréteur PHP, de machines virtuelles et des threads

Lors de l'AFUP Day, je vous ai présenté FrankenPHP, un SAPI experimental permettant d'embarquer notre langage préféré dans les serveurs web écrits en Go tels que Caddy ou le serveur web local de Symfony CLI. Ce talk revient sur le progrès effectués depuis l'AFUP Day, et sur les nouveaux problèmes rencontrés suite aux retours de la communauté.

FrankenPHP utilise cgo pour permettre au code Go d'appeller le code de l'interpreteur PHP écrit en C, et inversement. Cela revient à faire exécuter la machine virtuelle de PHP elle même au sein d'un process géré par le runtime Go. Cette technique offre des opportunités immenses :

  • simplifier vos déploiements en embarquant directement un serveur web, l'interpréteur PHP et votre code source dans un seul binaire ;
  • conserver les services des applications Symfony ou Laravel chargés dans la mémoire du serveur web et s'en servir pour traiter plusieurs requêtes HTTP ;
  • écrire des fonctions en Go (ou en C, voir même en assembleur) et les appeler directement depuis le code PHP ou encore

Cependant, faire cohabiter le runtime de deux langages dans un seul process n'est pas chose aisée. Dans ce talk orienté programmation système, nous étudierons tous les pièges que nous avons du contourner pour réaliser ce synchrétisme particulier. Ca sera l'occasion de découvrir comment fonctionne l'interpréteur PHP, son mode ZTS, les threads systèmes et les green threads de Go, les signaux Unix ou encore les problèmes que peuvent poser les astuces utilisées par l'interpréteur PHP pour implémenter des fonctionnalités telles que le max_execution_time.

Note : il n'est pas nécessaire d'avoir vu le premier talk pour assister à celui ci.

Ballroom ABCDEF - Grace Hopper
14/10/2022
14:40-15:20

Tes derniers projets (Mercure, Vulcain) sont tous écrits en Go, comme FrankenPHP. Est-ce le langage complémentaire à PHP ?

Grâce à son support natif de la concurrence (l’emblématique mot-clef « go ») et à sa bibliothèque standard très fournie en implémentation haute-performance des protocoles réseaux, Go permet de créer relativement facilement des services réseaux performants et sécurisés.
C’est pour ça que je l’ai utilisé pour réaliser les implémentations de référence de Mercure et de Vulcain. C’est aussi pour ça que ce langage est en train de devenir hégémonique en ce qui concerne l’infrastructure réseau et cloud : Docker, Kubernetes et Traefik sont également écrits en Go pour ne citer que quelques exemples connus.
Les implémentations de référence de Mercure et Vulcain peuvent être utilisés avec n’importe quel langage de programmation, mais comme ils respectent les standards et que PHP aussi, ces deux outils sont très faciles à utiliser depuis une application PHP : pour envoyer un message aux navigateurs via un hub Mercure (le composant écrit en Go), il suffit de lui envoyer une requête POST à l’aide de curl ou même de file_get_contents() ; pour ajouter le support de Vulcain à n’importe quelle app PHP, il suffit de positionner le reserve proxy écrit en Go devant le serveur web servant l’app PHP.
Concernant FrankenPHP, l’intégration va beaucoup plus loin. L’interpréteur PHP est écrit en C, et Go peut appeler (et être appelé depuis) du code C. L’idée principale de FrankenPHP est de pouvoir embarquer l’interpréteur PHP dans n’importe quel programme Go, et en particulier dans le toujours plus populaire serveur web Caddy, lui aussi écrit en Go.
Comme nous le découvrirons lors de la conférence, cela permet d’exposer les fonctionnalités puissantes de Go (et de Caddy) directement au code PHP.
Cela permet des usages novateurs comme distribuer des applications complètement autonomes (le code PHP est directement embarqué dans le binaire du serveur web), utiliser les bibliothèques optimisées écrites en Go (ex : cache) ou encore tirer partie des nouveautés bas niveau du standard HTTP qui sont quasi-impossibles à implémenter en l’état actuel des choses avec PHP FPM (ex : les Early Hints).
En bref, Go est parfait pour écrire des services réseaux (HTTP en particulier), et est compatible C. PHP permet d’écrire des applications web et est écrit en C, ces deux langages sont effectivement très complémentaires !

FrankenPHP a t-il un jour l’objectif de devenir un projet « production ready » ou est-il destiné à rester un « side-project » ?

L’objectif est clairement de le rendre production ready, et on s’en approche à grands pas !

Tu es un speaker confirmé et un habitué des évènements AFUP, qu’est-ce qui rend l’exercice toujours intéressant après autant de fois pour toi ?

C’est un moment unique qui permet d’échanger avec la communauté et d’avoir des retours de qualité sur des concepts nouveaux. Et puis je dois avouer que ça me motive et que ça me donne une deadline pour finaliser des projets… comme FrankenPHP ! J’ai toujours hâte de pouvoir présenter des nouveaux projets au Forum PHP.

Une conférence présentée par

Kévin DUNGLAS
Kévin DUNGLAS
Kévin est le créateur du framework API Platform ainsi que des projets Mercure et Vulcain. Il est également membre de la Core Team Symfony et a cofondé la société autogérée Les-Tilleuls.coop.

Autres interviews