Utiliser les générateurs en PHP pour optimiser votre code ? Qu’est-ce que c’est ?
Je me baladais sur des repos Github l’autre jour (chacun ses passions aha), et je suis retombé sur un mot-clé que je n’avais plus croisé depuis longtemps : yield
Pour certain c’est la base, pour d’autre un concept bien obscure, et pour ma part c’était quelque chose que j’avais déjà utilisé à l’époque mais rapidement laissé de côté (et c’était une grave erreur).
Pourquoi une erreur ? Tout simplement parce qu'il pourrait juste vous sauver la RAM et le CPU de votre serveur ! (et au passage faire jolie dans votre repo Git)
YELD, c’est quoi ?
Yeld c’est un mot clé que vous allez pouvoir placer dans une fonction PHP, et qui va la transformer comme par magie en générateur.
Mais pourquoi faire ? Et d’ailleurs à quoi ça sert un générateur ?
On va illustrer ça avec un exemple clair, pour vous montrer toute la puissance :
<?php
// Sans générateur
function getAllExpensivesData() {
return range(1, 1_000_000) ;
}
foreach( getAllExpensivesDate() as $numb) {
echo $numb;
}PHPCette exemple, sans aucun générateur, va fonctionner, certes, mais va littéralement stocker le résultat de getAllExpensivesData dans la RAM de votre serveur.
Et en imaginant un peu, getAllExpensivesData pourrait tout à fait se mettre à retourner des milliers de lignes d’une BDD par exemple. Et dans ce cas là ? On sature tout, et bye votre RAM et la réponse à l’utilisateur.
Yeld, et la magie des générateurs
Refaisons le même exemple cette fois-ci avec Yeld :
<?php
// Avec générateur
function getAllExpensivesData() {
for($i=0;$i<100_000;$i++) {
yield $i;
}
}
foreach( getAllExpensivesData() as $numb) {
echo $numb;
}PHPCette fois-ci, vous pouvez faire le test, surchargez autant que vous voulez le retour de getAllExpensivesData, la RAM ne servira pas de tampon, et le générateur jouera son rôle, et itérera au fûr et à mesure (si cela vous intéresse derrière c’est un Generator qui est instancié automatique, avec les méthodes next() etc …).
Donc ? Un gros changement pour vos boucles coûteuses, le temps de traitement ne sera pas forcément réduit, mais la charge globale du serveur le sera !
Utiliser yeld dans la vie de tous les jours
Un dernier petit élément à voir, c’est Yeld from !
En effet, le mot-clé peux être accompagné de « from », pour qu’il délègue sa création à un autre itérateur ! (bon ok ça paraît chelou comme ça, mais regardez) :
PDO produit des itérateurs de base, mais si on souhaite tous les rassembler à un endroit, on pourrait totalement faire ça :
<?php
function fetchAllUsers(PDO $pdo): Generator {
yield from fetchDbUsers($pdo);
yield from fetchApiUsers();
yield from fetchCsvUsers('/tmp/users.csv');
}PHPMaintenant, de votre côté si la structure de la données de vos utilisateurs est la bonne, vous venez de récupérer potentiellement des milliers d’utilisateurs derrière un seul Générateur qui ne sabotera pas votre RAM et qui sera un point unique d’entrée !
J’espère que cet article vous aura plu, je repars me perdre sur Github (c’est faux) !
(A très vite et n’hésitez pas à lâcher un petit cœur juste en dessous si vous avez lu cette phrase)
Besoin de concentration ?
Testez mon nouvel outil « Pomodoro Timer » pour optimiser votre temps de travail et votre productivité !




