Non, PHP n’est pas mort !

Temps de lecture estimé : 13 minute(s)

*Attention, ce contenu a été publié il y a 3 années. Il n'est peut-être plus d'actualité.*

En juin dernier, le langage PHP a fêté ses 20 ans. Bien qu’entré dans l’âge adulte et très largement répandu, PHP traîne une mauvaise réputation. On lui reproche régulièrement d’être trop permissif, trop lent ou encore supporté par une communauté qui ne serait pas assez professionnelle. Résultat, PHP est souvent écarté des projets web de grande envergure. Les griefs émis à l’encontre de PHP sont bien souvent fondés. Mais les évolutions apportées à ce langage depuis 2009, avec l’arrivée de la version 5.3, doivent nous conduire à réviser nos jugements. Car ce langage, qui a fortement participé à l’expansion des sites web dynamiques et dont la version 7 va sortir mi-novembre, est plus que jamais encore dans la course. Vincent Cassé est développeur chez OVH, au sein de l’équipe qui gère l’infrastructure de l’Hébergement Web proposé par OVH.com. Il a notamment travaillé sur l’application web d’hubiC, codée en PHP.

Vincent Cassé est développeur chez OVH, au sein de l'équipe qui gère l'infrastructure de l'Hébergement Web proposé par OVH.com. Il a notamment travaillé sur l'application web d'hubiC, codée en PHP.
Vincent Cassé est développeur chez OVH, au sein de l’équipe qui gère l’infrastructure de l’Hébergement Web proposé par OVH.com. Il a notamment travaillé sur l’application web d’hubiC, codée en PHP.

PHP, un langage trop permissif ?

En langage informatique, deux choix existent : les langages typés, et ceux qui ne le sont pas (on parle alors de typage dynamique). Les langages typés imposent aux développeurs de définir sous quel format seront stockées les informations qu’ils souhaitent enregistrer dans des variables (en mémoire). Les langages dynamiques se chargent eux-mêmes de trouver le meilleur format pour enregistrer les données. C’est plus simple pour le développeur, mais il arrive fréquemment que l’utilisation de la mémoire ne soit pas optimisée. Par exemple, dans le cas où vous devez gérer un grand nombre de données, vous choisirez naturellement un format peu gourmand en mémoire par donnée. Les langages de haut niveau, dont PHP fait partie, ne font pas toujours les choix les plus judicieux. Celui qui n’a pas conscience du fonctionnement de PHP peut assez facilement développer un programme qui monopolise toutes les ressources du serveur, et en déduire que PHP est un langage trop permissif. Or, ce n’est pas le cas !

En fait, le typage dynamique impose une certaine rigueur dans l’écriture du code. Il est ainsi théoriquement possible de mélanger deux formats de données différents. Mais le résultat n’est pas forcément celui attendu ! Essayez donc d’additionner un mot du dictionnaire avec un chiffre. Comment ? Vous ne feriez jamais cela ? Pourtant, c’est l’une des causes de bug les plus répandues en PHP. Cependant, le typage dynamique a un intérêt majeur. Sur le web, la majeure partie des données est échangée au format texte (via le protocole HTTP). Dans certains cas, ce ne sont pas des données texte mais d’autres valeurs numériques que l’on attend : cela fait bientôt 20 ans que le web permet d’échanger des images et des vidéos ! L’utilisation d’un typage dynamique permet au développeur de simplifier son code et de passer d’un texte à une valeur numérique très facilement. L’effet collatéral étant la multiplication des risques de bug et problèmes de maintenance des applications développées…

L'utilisation d'un typage dynamique permet au développeur de simplifier son code et de passer d'un texte à une valeur numérique très facilement. L’effet collatéral étant la multiplication des risques de bug et problèmes de maintenance des applications développées...
L’utilisation d’un typage dynamique permet au développeur de simplifier son code et de passer d’un texte à une valeur numérique très facilement. L’effet collatéral étant la multiplication des risques de bug et problèmes de maintenance des applications développées…

La communauté qui supporte PHP, et plus largement les développeurs web, ont heureusement beaucoup évolué ces dix dernières années. Les mauvaises pratiques ont été inventoriées, documentées et surtout, de nombreux outils permettant de les éradiquer se sont démocratisés. L’un des meilleurs exemples est l’ OWASP qui répertorie chaque année les problèmes de sécurité les plus courants sur Internet. Dans ce contexte, est-il encore permis de qualifier PHP de langage permissif ? Une bonne connaissance du typage dynamique permet facilement d’en éviter les pièges. Et puis, surtout, rien n’oblige le développeur à être aussi libertaire que le langage qu’il utilise !

Plébiscité par les débutants, injustement boudé par les professionnels

La popularité de PHP s’explique assez simplement. La souplesse de ce langage le rend accessible aux débutants, et par conséquent nous sommes nombreux à avoir appris le développement avec PHP. Mais, en informatique comme en amour, les débuts sont souvent difficiles. Et il y a des projets dont il arrive d’avoir un peu honte quelques années après ! Beaucoup d’applications PHP, codées par des développeurs peu expérimentés, constituent des catalogues de mauvaises pratiques, aux conséquences parfois importantes en termes de sécurité et de performances : problèmes de sécurité avec les données client*, traitement de données massives sans optimisation… Par un raccourci assez facile, PHP a été désigné comme le bouc-émissaire.

Beaucoup d'applications codées en PHP sont l’œuvre de débutants, raison pour laquelle le code est souvent mal optimisé.
Beaucoup d’applications codées en PHP sont l’œuvre de débutants, raison pour laquelle le code est souvent mal optimisé.

Par ailleurs, au début des années 2000, alors qu’Internet se démocratisait, les communautés des langages concurrents de PHP se sont structurées. C’est à cette époque que des plateformes se sont créées pour mutualiser les librairies (morceaux de codes réutilisables), ce qui a participé à améliorer la qualité des projets développés en Java par exemple. La communauté de PHP a tardé à se rassembler, contraignant chaque équipe de développement à redévelopper, plus ou moins bien, ses propres librairies. Dans le milieu professionnel, PHP s’est forgé une image de langage pour débutants, inadapté pour des projets sérieux.

On retrouve pourtant du PHP dans des projets web de grande ampleur, tels que Facebook ou Wikipédia, qui revendiquent plusieurs millions de connexions par jour… et dont les équipes n’ont rien des débutants que j’évoquais plus haut. Pourquoi ? En 2009, la communauté PHP s’est réveillée et le langage a profondément changé. La version 5.3, sous l’apparence d’une release d’importance mineure, a été à l’origine de nombreux changements, à commencer par l’apparition d’une fonctionnalité cruciale : le mécanisme de namespace. Les namespaces simplifient grandement la séparation du code entre différentes librairies, en réduisant les effets de bord. Cela a permis l’écriture de librairies, ce que la communauté PHP a encouragé avec la création de la plateforme Composer pour les mutualiser et les distribuer. Le nombre de librairies disponibles sur Composer a rapidement explosé et a permis aux développeurs de se concentrer sur des parties plus techniques de leur métier.
La librairie Guzzle en est un parfait exemple : avant l’arrivée de Composer, la réalisation de requêtes en HTTP s’appuyait souvent sur Curl. Avec cette extension du langage, il était simple de faire des requêtes HTTP, mais de nombreuses contraintes techniques n’étaient pas forcément prises en compte (définition du timeout, de la taille limite des données, utilisation de streaming…). Le téléchargement de gros fichiers aboutissait ainsi souvent à des dépassements de mémoire. Guzzle est arrivé, embarquant l’ensemble de la logique nécessaire pour optimiser l’utilisation de Curl et effectuer les requêtes HTTP plus simplement. Résultat : les bonnes pratiques se sont diffusées, et l’empreinte mémoire des scripts PHP effectuant des requêtes HTTP a globalement diminué.

En parallèle de la sortie de PHP5.3, l’arrivée de grand frameworks de développement tels que Symfony2, Zend Framework2 ou plus récemment Laravel ont permis d’industrialiser les développements en PHP. Ces nouveaux frameworks ont apporté des techniques plus rapides de développement et ont contribué eux aussi à la diffusion des bonnes pratiques en simplifiant la mise en place de caches, en augmentant les niveaux de sécurité et accélérant l’exécution du code. Bref, depuis maintenant cinq ans, les outils nécessaires à l’utilisation de PHP comme « langage professionnel » sont en place. Enfin, PHP 5.3 a également marqué l’accélération des releases du langage, sur un rythme quasi-annuel. PHP 5.6 est aujourd’hui disponible, et d’ailleurs seules les versions 5.5 et 5.6 sont encore supportées par la communauté.

PHP, un langage lent ? Tout est question d’interprétation…

J’évoquais un peu plus haut Facebook, en tant que projet exploitant PHP à grande échelle.
Il faut être honnête : Facebook n’utilise pas PHP comme vous et moi. L’entreprise a cherché à accélérer le fonctionnement du code PHP. Après avoir tenté de compiler PHP en 2010 avec le logiciel Hip-Hop, les développeurs de Mark Zuckerberg ont créé en 2013 une nouvelle plateforme d’exécution de PHP, nommée HHVM, et ont abouti à un langage plus restrictif que PHP, nommé Hack. Faut-il pour autant en déduire que PHP souffre de problèmes chroniques de lenteur ?

PHP est un langage interprété. Pour cette raison, il est nécessairement plus lent que des langages compilés, c’est-à-dire transformés en exécutables autonomes (dans le langage natif de la machine), tels que le C ou le C++. Les langages interprétés sont « compilés » à chaque exécution, ce qui ajoute du temps de calcul. Certains d’entre eux, comme Java ou Python, sont parfois « précompilés » dans un langage plus proche de celui de la machine (bytecode), mais leur exécution nécessite tout de même une seconde (et très rapide) interprétation. Enfin, certains langages (PyPI, Java8, Lua…) sont désormais capables de se compiler directement en langage natif de la machine durant leur exécution, ceci permettant un démarrage très rapide de l’application. On nomme ce procédé le JIT (Just-In-Time compilation).

Pour en revenir à la supposée lenteur de PHP, force est de constater qu’il n’est pas le seul langage web interprété, loin de là ! PHP a cependant une spécificité : il n’est pas persistant. Lorsqu’un internaute se connecte à un site en PHP, le serveur PHP est réinitialisé puis recompilé. Au contraire, des langages tels que Java sont compilés uniquement au démarrage de l’application, qui coïncide souvent avec le démarrage du serveur. Ce choix de conception se révèle un atout pour la scalabilité des applications codées en PHP : chaque requête bénéficie d’un environnement neuf et sain pour s’exécuter. S’il y a des fuites de mémoire, par exemple lors de l’utilisation de l’application, cela n’impactera pas les requêtes des utilisateurs suivants. La sécurité est également plus élevée, puisque chaque requête est isolée. Surtout, ce fonctionnement procure une meilleure stabilité aux applications. Cela évite aux administrateurs systèmes de redémarrer régulièrement le serveur PHP, contrairement à ce qu’ils sont contraints de faire avec Tomcat (serveur Java), qui monopolise toute la RAM au-delà d’un certain temps d’activité (cela n’arrive bien sûr qu’aux applications mal codées !).

Alors, oui c’est vrai, le fait que PHP ne soit pas persistant a pu provoquer des lenteurs, comparé à d’autres langages. Mais ce n’est plus le cas depuis 2012. Sortie cette année-là, la version 5.4 de PHP inclut par défaut un mécanisme de cache, OPcache**, permettant de conserver la compilation lors de la première utilisation. Certains diront que ce n’est pas à proprement parler une nouveauté, puisque des modules tels que eAccelerator, APC ou Xcache ont toujours été fortement utilisés pour répondre à cette même problématique de « lenteur » de PHP. Toutefois, ce mécanisme de cache ayant été intégré au cœur de PHP, on se rend compte que sa vitesse d’exécution, est, d’une manière générale, tout à fait comparable à celle des autres langages. Avec, en outre, l’avantage de la scalabilité. Pour cette raison, nous recommandons aux utilisateurs de passer à une version de PHP plus récente et d’activer le moteur PHP-FPM afin de bénéficier de ces améliorations de performance !

Sortie en 2012, la version 5.4 de PHP inclut par défaut un mécanisme de cache, OPcache, permettant de conserver la compilation lors de la première utilisation.
Sortie en 2012, la version 5.4 de PHP inclut par défaut un mécanisme de cache, OPcache, permettant de conserver la compilation lors de la première utilisation.

Pourquoi donc cette réputation de langage lent colle-t-elle à PHP ? Bien que PHP5 soit un peu moins performant que les langages JIT, il est probable que, là encore, il faille incriminer le niveau moyen des développeurs PHP, plombé par le grand nombre de débutants parmi eux. En effet, de nombreux sites en PHP sont lents, non pas à cause du code PHP mais des relations entre l’application et son environnement. La plupart des sites en PHP utilisent une base de données hébergée sur un autre serveur et n’optimisent pas leurs requêtes SQL. Certaines enregistrent des fichiers sur le disque dur du serveur. Autant d’actions qui ajoutent des latences : réseau, écriture disque. Sans compter les défauts d’optimisation… On ne compte plus les sites qui « rament » à cause de requêtes dans une base de données sans index ! Un exemple courant : les extensions de WordPress, codées en PHP. Elles sont nombreuses à faire des requêtes vers d’autres serveurs ou à aller chercher de nombreuses données en base, à chaque requête d’internaute. Et cela ralentit considérablement les sites, sans que PHP n’y soit pour quelque chose ! Au passage, si vous souhaitez essayer de comprendre pourquoi votre application n’est pas performante, je vous invite à regarder cette conférence « Beyond PHP – it’s not (just) about the code » , présentée lors du Fosdem 2015.

À quelques semaines de la sortie de PHP 7, que nous proposerons en bêta test sur l’Hébergement Web OVH.com, il semblait opportun de démonter quelques-unes des idées reçues sur PHP. Car, non, ce langage n’est pas mort ! Il possède même de sérieux atouts vis-à-vis de l’une de problématiques les plus intéressantes à laquelle nous sommes tous plus ou moins confrontés aujourd’hui : la scalabilité des applications et des infrastructures qui les hébergent. Nous reviendrons en détails sur PHP 7 dans un prochain article. D’ici là, j’espère que vous aurez l’occasion de reconsidérer PHP d’un œil neuf, sans préjugés !

 * Les injections SQL ont longtemps été l’un des soucis les plus importants dans les applications PHP : www.owasp.org/index.php/SQL_Injection

**Si vous voulez en savoir plus sur le fonctionnement technique de OPcache, je vous renvoie vers la conférence de Julien Pauli, release manager des deux dernières versions de PHP. Voir la vidéo I Voir les slides

Tech lead on OVH hosting and for some cakes.