Industrialisation PHP

3fév/102

HipHop : Une révolution pour PHP ?

La rumeur courait depuis que dimanche un employé avait laissé entendre dans une interview que Facebook travaillait sur un projet secret visant à améliorer radicalement les performances de PHP. L'annonce officielle a été faite hier par l'équipe qui travaille sur ce projet dont le nom est HipHop for PHP.

Ce projet fait suite à toute une série d'améliorations initiées ou supportées par Facebook pour améliorer les performances de PHP comme les patchs proposés pour l'extension APC.

Un fonctionnement novateur

Avant de voir comment fonctionne HipHop, faisons un rappel sur le fonctionnement de PHP. Il s'agit d'un langage de script et non un langage interprété comme Java ou compilé comme C ou C++. Cela signifie qu'à chaque exécution PHP doit analyser lexicalement puis syntaxicalement le script appelé, le transformer en OP Code, un format binaire, puis exécuter cet OP Code. La phase d'analyse du script et de création de l'OP Code peut être optimisée à l'aide d'un cache d'OP Code comme APC.

HipHop a choisi une approche radicalement différente qui consiste à transformer le script PHP en code source C++ qui sera ensuite compilé avec les outils standards de ce langage.

Schéma de transformation de HipHop for PHP

La transformation se fait en trois étapes :

  • Analyse statique afin de déterminer qui déclare quoi et les dépendances afférentes ;
  • Détermination du type C++ le plus adapté, si la variable change de type au cours de sa vie un type "variant" proche des zval du Zend Engine sera utilisé ;
  • Transformation des structures PHP en code C++.

La substitution de HipHop au binaire PHP officiel vise à être transparente pour les développeurs mais bien entendu, tout cela n'est pas miraculeux et quelques contraintes existent.

Les limites

Tout d'abord, Windows n'est pas supporté et ne le sera probablement pas dans un avenir proche. Cela n'est pas un problème majeur car les serveurs de production des utilisateurs potentiels sont quasiment tous sous Unix mais cela pourrait compliquer son adoption car la majorité des postes de développement restent sous Windows.

Plus impactant, une fois compilé HipHop utilise son propre serveur web, ou son interface ligne de commande. Il est cependant possible de le coupler à Apache ou tout autre outil via un reverse proxy.

Par ailleurs, comme tout "émulation" d'un langage, HipHop ne peut être 100% compatible avec la dernière version de PHP. Il implémente aujourd'hui l'essentiel des fonctionnalités de PHP 5.2 ainsi que des extensions principales. Il faut noter que pour des raisons techniques évidentes certaines fonctions ne peuvent être supportées comme eval(), qui exécute dynamiquement du code PHP passé en argument.

L'absence d'eval() n'est pas très grave car il n'y a pratiquement aucune bonne raison d'utiliser cette fonction. En revanche, cela veut probablement dire que les assertions, qui évaluent du code à la volée pour vérifier le comportement de l'application, ne seront pas utilisables ce qui est dommage.

Quel public pour HipHop ?

Disons le clairement, en l'état actuel, HipHop n'est pas pour tout le monde. Le mode d'exécution classique de PHP a de beaux jours devant lui, notamment pour les hébergements mutualisés. La cible de HipHop est donc principalement les sites à fort et très fort trafic, à l'image de Facebook.

HipHop pourrait également être utile pour les scripts lancés en ligne de commande pour effectuer des opérations longues et récurrentes comme des imports. Ces opérations sont souvent lentes et consommatrices de CPU et de mémoire.

Révolution ou simple expérimentation ?

Il est un peu tôt pour se prononcer mais HipHop s'inscrit dans la tendance actuelle où l'on voit de plus en plus nettement se creuser un fossé entre les besoins simples des petites applications peu sollicitées, que l'on pourrait qualifier d'approche historique, et ceux beaucoup plus exigeants des applications critiques développées par des acteurs économiques de premier plan.

Le risque qu'engendre cette divergence des besoins et des moyens est une scission de la communauté PHP qui constitue l'une de ses forces. Pour le moment nous n'en sommes heureusement pas là et je doute que ce soit le but de Facebook qui une fois de plus réaffirme clairement son attachement à PHP pour sa simplicité et sa flexibilité.

Enfin, l'absence de support pour PHP 5.3 aura-t-elle un impact négatif sur l'adoption de ce dernier chez les grands comptes ?

About Jean-Marc Fontaine

Consultant senior pour Alter Way Consulting et responsable de l'offre PHP chez Alter Way Solutions.
Commentaires (2) Trackbacks (0)
  1. Et pour ceux que cela intéresse, David Recordon, « Senior Open Programs Manager » chez Facebook, sera présent au FOSDEM ce dimanche pour nous parler de la scalabilité de Facebook au moyen d’outils Open Source: http://www.fosdem.org/2010/schedule/events/scalingfacebook
    C’est également lui que vous pouvez voir dans la vidéo consacrée à la première présentation technique de HipHop pour PHP: http://bit.ly/9xSmYp

  2. Reste à tester la bête.
    Si je fais abstraction de l’usage principal qui concerne bien sûr les applications web, la perspective de pouvoir générer des binaires en ligne de commande à partir de simples scripts php est très séduisante. De quoi optimiser ses scripts shell ?
    Aussi, créer des extensions spécifiques pour hiphop en C++ sera probablement beaucoup plus fun que ne le sont les extensions php traditionnelles.

    Si le projet émanait de Zend, là on pourrait parler de véritable révolution. Comme la transformation n’est pas isomorphe, il y a un risque de scission effectivement. Par chance, le projet étant opensource, on peut espérer une certaine réactivité limitant les divergences.

    Une fois le projet publique et analysé sous toutes ses coutures, je ne serai pas étonné que des codes php destinés à être transformés en C++ soient au final doublement optimisés car adaptés dès leur conception aux caractéristiques de hiphop. Par exemple, dérouler de longues séries de properties/getters/setters plutôt que de recourir à des magic methods ou des array membres (juste un exemple qui me vient en tête).

    A voir. En tout cas, c’est cool


Laisser un commentaire


Aucun trackbacks pour l'instant