PHP fiber: Quand PHP joue à Javascript

par | Oct 4, 2021 | Nouveautés

Une RFC introduisant les “Fibers” est passée récemment en discussion pour être embarquée à la prochaine version de PHP 8.1. 

Vous vous posez probablement la question “Mais ça veut dire quoi ce machin?”. La RFC les définit comme suit:

“Fibers allow the creation of full-stack, interruptible functions that can be used to implement cooperative multitasking in PHP. These are also known as coroutines or green-threads.”

Pas trop pratique non ?

Ce qu’il faut retenir c’est que les Fibers sont des mécanismes qui permettent de gérer l’exécution d’instructions en parallèle.

Pour faire encore plus simple, ceci nous permet d’écrire, nativement, du code asynchrone avec PHP.

Qu’est ce que l’asynchrone ?

Ceux qui viennent du monde JavaScript sont déjà familiers avec ce concept. Ceux qui écrivent du PHP on l’habitude d’écrire du code synchrone: c’est à dire que code s’exécute ligne après ligne (on parle, surtout, des traitements lents qui font appel à des ressources externes commes les appels au webservices, la lecture de fichiers, les requêtes sur les bases de données)

Le schéma ci -dessous illustre la différence entre l’exécution synchrone et asynchrone:

Sync vs Async

Quels en sont les bénéfices ?

Comme vous pouvez le voir sur le schéma ci-dessus, nous obtenons des temps d’exécution plus avantageux.

En effet, l’exécution de chaque instruction n’est pas bloquée par l’instruction qui la précède. Pour faire l’analogie, imaginez un chef en cuisine qui lance plusieurs préparations à la fois au lieu préparer l’une après l’autre.

Credits: https://giphy.com/

Assez parlé! On veut de l’action!

Notre labo de test

TL;DR: https://github.com/tarekdj/php-async-demo

Pour des soucis de simplicité, nous utilisons PHP 8.0 avec l’extension ext-fiber. Le scénario est le suivant: 

  • 3 scripts effectuant le même traitement (PHP sync, PHP async, Nodejs).
  • Les différents scripts effectuent 3 requêtes HTTP et affiche un output.

Les résultats de la course

Comme vous pouvez le constater, tout en restant sur du PHP, nous obtenons un gain considérable en temps d’exécution quand nous passons à de l’asynchrone.

Nous remarquons, aussi, que les performances se rapprochent considérablement de ceux de NodeJS. 

Conclusion

Il est à noter que le but de cet article n’est pas de comparer PHP à NodeJS. L’objectif principal est de mettre en valeur le gain en temps d’exécution obtenu par l’asynchrone.

Ressources: