Blog

Créer une fonction PHP en C++

Je me demandais depuis des années comment écrire des fonctions en C ou C++ utilisables en PHP. En fouillant un peu, je suis rapidement tombé sur http://www.php-cpp.com/. Il s’agit d’une bibliothèque C++ rendant la création d’extensions PHP plus abordable et plus amusante (ce n’est pas moi qui le dis) !

Je pense qu’il existe d’autres solutions, mais je me suis arrêté à la première que j’ai trouvée, qui me semblait être sérieuse et surtout la plus abordable pour mes connaissances en C++ extrêmement limitées.

Je me suis donc lancé dans l’écriture d’une fonction « native » PHP et j’ai choisi de mettre en place un algorithme de tri en m’appuyant sur un arbre binaire de recherche. L’objectif étant d’avoir un aperçu, même infime, de ce qui se trame derrière ce langage populaire, de découvrir de nouvelles choses, et surtout d’assouvir ma soif de curiosité (le point principal 🙃).

L’article trouvé sur wikipédia explique très bien le mode opératoire, il est intéressant à lire, et ce schéma peut donner un idée du raisonnement à suivre.

Pour mes besoins, j’ai dû légèrement étendre l’algorithme de base :

  • Je construis récursivement un arbre binaire de recherche
    • Ce type d’arbre est constitué de plusieurs nœuds
    • Chaque nœud possède :
      • Une valeur numérique
      • Une référence vers un nœud de valeur inférieure (à gauche), si elle existe
      • Une référence vers un nœud de valeur supérieure (à droite), si elle existe
      • Une référence vers un nœud parent, s’il existe
      • Un flag qui détermine si le nœud a déjà été ajouté au résultat trié
    • A chaque itération
      • Je cherche le parent approprié pour positionner le nouveau nœud (une feuille au moment où le nœud est ajouté)
      • Je garde en mémoire le nœud ayant la valeur la plus petite, elle me servira de point de départ pour trier le tout
  • Une fois que l’arbre est construit, je récupère les valeurs de manière croissante en suivant un ordre logique
    • Je pars du nœud contenant la valeur la plus petite, que je connais déjà
    • Et je fais le yo-yo, l’arbre étant ordonné suivant une logique établie dès le départ, je sais comment récupérer mes valeurs dans le bon ordre

Problème : ma dernière ligne de code en C++ a au moins 10 ans, alors que j’étais étudiant 👶! Heureusement, on trouve beaucoup d’articles et d’exemples sur des sites spécialisés :

Je partage mon code, il pourra peut-être servir ou donner des idées à certains. Il est loin d’être parfait, il peut être amélioré, tant sur la syntaxe du langage que je ne maîtrise pas du tout, que sur l’algorithme en lui-même.

Il s’agit vraiment d’un test que j’ai souhaité faire, il n’a donc rien d’exceptionnel.

Je trouve cette approche vraiment intéressante. Ce n’est pas une surprise, le code C++ compilé sera toujours plus rapide que PHP et lorsque c’est bien codé, la gestion de la mémoire est optimisée. Je pense que pour des cas vraiment très particuliers qui sortent du cadre « agence web », ça peut valoir le coup de se pencher sur ce type de solution. A titre d’exemple, sur un tableau de 10000 entrées :

  • Algo codé en PHP : j’ai dû couper l’exécution du script qui ne se terminait pas 😅
  • Algo codé en C++ : 0.0052 s

Voir les sources sur GitLab.