Pascal MARTIN (n+1).zéro http://blog.pascal-martin.fr/ Mots de Développement Web : PHP & JavaScript fr Sun, 26 May 2013 00:16:15 +0200 © Pascal MARTIN http://blogs.law.harvard.edu/tech/rss AstralBlog Ce mois-ci sur internals@php - Avril 2013 http://blog.pascal-martin.fr/post/php-mailing-list-internals-avril-2013?utm_source=rss2&utm_medium=feed&utm_campaign=php-mailing-list-internals-avril-2013 http://blog.pascal-martin.fr/post/php-mailing-list-internals-avril-2013 Mon, 06 May 2013 07:00:00 +0200 Pascal MARTIN phpinternals@ <p> </p> <p>Après un <a href="http://blog.pascal-martin.fr/post/php-mailing-list-internals-mars-2013">mois de mars</a> relativement calme, voici mon dépilage d’<code>internals@</code> pour le <strong>mois d’avril 2013</strong>, qui poursuit la tendance avec <em>seulement</em> 359 mails.</p> <p>Sous forme d’un graphique représentant le nombre de mails par mois sur les trois dernières années, on obtient <em>(l’historique depuis 1998 est disponible <a href="http://blog.pascal-martin.fr/public/internals-php/nombre-de-mails-internals-2013-04-historique-complet.png">ici</a>)</em> :</p> <p><span style="display:block;text-align:center;"><a href="http://blog.pascal-martin.fr/public/internals-php/nombre-de-mails-internals-2013-04.png"><img alt-src="data:image/gif;base64,R0lGODdhAQABAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAAQABAAAIBAChBQQAOw==" alt="Nombres de mails sur internals@ ces trois dernières années" class="lazy" src="http://blog.pascal-martin.fr/public/internals-php/small-nombre-de-mails-internals-2013-04.png" width="448px" height="298px"></a></span></p> <p><br></p> <p>La sortie de <strong>PHP 5.5</strong> continue de se rapprocher : la version <code>bêta3</code> <a href="http://news.php.net/php.internals/67045">a été publiée</a> le 11 avril, et la <code>bêta4</code> <a href="http://news.php.net/php.internals/67140">a suivi</a> le 25 avril. Cette version <code>bêta4</code> devrait être la <strong>dernière version <code>bêta</code></strong>, la <strong>première version <code>RC</code> étant prévue pour le 9 mai</strong>.</p> <p>Dmitry Stogov <a href="http://news.php.net/php.internals/67024">a travaillé</a> sur des optimisations pour l’extension de cache d’opcodes <code>ext/opcache</code> qui sera inclue à PHP 5.5, et s’est demandé si ces optimisations avaient leur place dans PHP 5.5, ou s’il était plus prudent de les prévoir pour la version suivante de PHP. Une réponse <a href="http://news.php.net/php.internals/67027">apportée</a> par Zeev Suraski est qu’il devrait être possible de mettre en place des optimisations ne travaillant que sur un seul fichier ; et que certaines idées ne mènent pas forcément à des résultats intéressants, le compilateur de PHP étant relativement rapide en lui-même. Pierre Joye, de son côté, <a href="http://news.php.net/php.internals/67029">a fait remarquer</a> que, même si des optimisations simples pouvaient être appréciables, les versions RC de PHP 5.5 approchaient.</p> <p>Comme <a href="http://news.php.net/php.internals/67059">l’a souligné</a> Larry Garfield, une durée de compilation <em>(compilation qui n’a lieu qu’une fois “de temps en temps”, avec un cache d’opcodes activé)</em> un peu plus importante pour les scripts PHP est acceptable, à partir du moment où les gains à l’exécution ne sont pas négligeables.</p> <p><br></p> <p>Avec l’intégration de <code>ext/opcache</code> à PHP, Johannes Schlüter <a href="http://news.php.net/php.internals/66909">a fait remarquer</a> qu’il y aurait probablement beaucoup d’utilisateurs qui essayeraient de charger cette extension avec <code>extension=</code> et non <code>zend_extension=</code> dans leurs fichiers de configuration. Le message d’erreur renvoyé lors de la tentative de chargement d’une Zend Extension avec <code>extension=</code> étant jusqu’à présent peu clair, pour éviter d’être submergés de demandes d’utilisateurs ne comprenant pas pourquoi <code>ext/opcache</code> refuse de se charger, il est proposé d’améliorer ce message — vu <a href="http://news.php.net/php.internals/66910">les</a> <a href="http://news.php.net/php.internals/66911">nombreux</a> <a href="http://news.php.net/php.internals/66918">retours</a> <a href="http://news.php.net/php.internals/66924">positifs</a>, le correctif a été intégré à PHP.</p> <p>A la toute fin du mois de mars, Laruence <a href="http://news.php.net/php.internals/66871">a proposé</a> d’ajouter une constante indiquant si PHP est compilé avec support des wrappers curl <em>(qui sont totalement distincts de l’extension <code>ext/curl</code> !)</em>. Ces wrappers ayant toujours été considérés comme expérimentaux, la discussion a finalement donné lieu à la rédaction d’une RFC visant à leur suppression : <a href="https://wiki.php.net/rfc/curl-wrappers-removal-rfc">RFC: Removal of curl-wrappers</a> — et même si la décision <a href="http://news.php.net/php.internals/67115">a été</a> un peu rapide pour rentrer dans la planning de sortie de PHP 5.5-bêta4, les wrappers curl seront supprimés pour PHP 5.5.</p> <p><br></p> <p>En tout début de mois, Sara Golemon <a href="http://news.php.net/php.internals/66895">a proposé</a> la <a href="https://wiki.php.net/rfc/php-array-api">RFC: PHP Array API simplification</a> : l’objectif est de fournir un fichier d’en-têtes <code>.h</code> permettant de simplifier les manipulations de tableaux PHP pour les développeurs d’extensions PHP <em>(ce point ne concerne que les développeurs d’extensions, et absolument pas les utilisateurs de PHP)</em>. Comme <a href="http://news.php.net/php.internals/66897">l’a souligné</a> Mike Willbanks, avec qui je ne peux être que d’accord, ce type de simplification est le bienvenu, en particulier pour les développeurs avec un background plus <em>userland</em>. La discussion n’a pas duré très longtemps et n’a pour l’instant pas mené à une inclusion de ce fichier d’en-têtes à PHP <em>(peut-être pour une prochaine version ?)</em>, mais il peut dès maintenant être inclu <em>manuellement</em> par les développeurs d’extensions qui voudraient en tirer profit.</p> <p>Un autre point qui peut intéresser les développeurs d’extensions PHP et/ou ceux qui aiment savoir <em>comment ça marche</em> : Julien Pauli <a href="http://news.php.net/php.internals/67033">a annoncé</a> avoir rédigé un article expliquant comment PHP charge ses extensions, et les différents hooks appelés : <a href="https://wiki.php.net/internals/extensions"><code>internals:extensions</code></a>. En parallèle, des améliorations <a href="http://news.php.net/php.internals/67039">sont en cours</a> de développement autour du chargement d’extensions, et <a href="http://news.php.net/php.internals/67092">pourraient</a> être mises en place pour PHP 5.6.</p> <p><br></p> <p>Laruence <a href="http://news.php.net/php.internals/67008">a proposé</a>, comme décrit via le <a href="https://bugs.php.net/bug.php?id=64554">Bug #64554: var_export does not export absolute namespace for classname </a>, d’ajouter un <code>\</code> en début de noms de classes pour les sorties de <code>var_export()</code>, <code>serialize()</code>, et autres fonctions du même type. Certains <a href="http://news.php.net/php.internals/67009">ont noté</a> que ceci semblait logique par rapport aux espaces de noms ajoutés avec PHP 5.3, alors que d’autres <a href="http://news.php.net/php.internals/67012">ont fait remarquer</a> que cela casserait la compatibilité avec PHP &lt;= 5.2 — et comme <a href="http://news.php.net/php.internals/67021">l’a souligné</a> Rasmus Lerdorf, il n’est <em>(malheureusement)</em> pas rare de sérialiser des données avec une version de PHP, les stocker en base de données ou les envoyer via le réseau à une autre machine, et vouloir les lire avec une autre version de PHP. <a href="http://news.php.net/php.internals/67084">En conclusion</a>, la documentation va être complétée, et le comportement de ces fonctions ne sera pas modifié.</p> <p>Frank Liepert <a href="http://news.php.net/php.internals/66999">a rédigé</a> la <a href="https://wiki.php.net/rfc/instance_counter">RFC: instance counter</a>. Les quelques retours qui ont été postés sont assez négatifs : savoir combien d’instances d’une classe donnée existent ne semble pas vraiment intéressant <a href="http://news.php.net/php.internals/67001">ni utile</a>. Les votes <a href="http://news.php.net/php.internals/67208">ont été ouverts</a> sur cette RFC à la toute fin du mois — considérant le peu de discussions qu’il y a eu sur <code>internals@</code> à ce sujet, je doute qu’elle passe.</p> <p>Julien Pauli <a href="http://news.php.net/php.internals/66942">a proposé</a> d’ajouter une option à <code>phpinfo()</code>, qui permettrait de récupérer la liste des options de configuration utilisées lors de la compilation de PHP <em>(j’ai au passage découvert <code>php-config --configure-options</code>)</em>. Les retours ont été assez négatifs, puisque peu de développeurs voient l’utilité d’un mécanisme de ce type, et suggèrent de plutôt utiliser les capacités de reflection de PHP.</p> <p>Julien Pauli <a href="http://news.php.net/php.internals/67167">a soumis</a> une idée où le bloc <code>catch</code> d’une exception pourrait rendre le contrôle à son bloc <code>try</code>. Amaury Bouchard <a href="http://news.php.net/php.internals/67171">a ensuite fourni</a> plus d’explications sur le pourquoi de cette idée. La discussion n’était pas terminée à la fin du mois, même si plusieurs <a href="http://news.php.net/php.internals/67187">semblaient penser</a> qu’utiliser des constructions <code>try</code>/<code>catch</code> de cette manière n’était pas une <em>bonne idée</em>. Nous aurons peut-être l’occasion de voir le mois prochain si les choses ont évolué.</p> <p>Igor Wiedler <a href="http://news.php.net/php.internals/67097">a annoncé</a> avoir commencé à rédiger la <a href="https://wiki.php.net/rfc/use_function">RFC: Importing namespaced functions</a>, et <a href="http://news.php.net/php.internals/67104">a ensuite posté</a> quelques cas où cette idée lui semble utile. La discussion n’était pas terminée à la fin du mois, et se poursuivra peut-être en mai…</p> <p><br></p> <p>Depuis le premier article que j’ai posté dans cette série de <a href="http://blog.pascal-martin.fr/tag/internals@">dépilages d’<code>internals@</code></a>, en <a href="http://blog.pascal-martin.fr/post/php-mailing-list-internals-novembre-2012">novembre 2012</a>, je crois que c’est la première fois que j’ai <em>aussi peu</em> de choses à dire. C’est probablement lié aux faits que PHP 5.5 arrive tout juste à la fin de sa période de bêta, qui marquait la fin d’ajout de fonctionnalités pour cette version, et que PHP 5.6 est encore loin, et pas encore entré en phase de développement actif !</p> <p><br></p> <hr> <p><strong><code>internals@lists.php.net</code></strong> est la <strong>mailing-list des développeurs de PHP</strong> ; elle est utilisée pour discuter des prochaines évolutions du langage, ainsi que pour échanger autour de suggestions d’améliorations ou de rapports de bugs. <br>Elle est publique, et tout le monde peut s’y inscrire depuis la page <a href="http://www.php.net/mailing-lists.php#internals">Mailing Lists</a>, ou consulter ses archives en HTTP depuis <a href="http://news.php.net/php.internals">php.internals</a> ou depuis le serveur de news <a href="news:/php.internals"><code>news://news.php.net/php.internals</code></a>.</p> <p><br></p> http://blog.pascal-martin.fr/post/php-mailing-list-internals-avril-2013#comment-new-form http://blog.pascal-martin.fr/post/php-mailing-list-internals-avril-2013#comment-new-form Ce mois-ci sur internals@php - Mars 2013 http://blog.pascal-martin.fr/post/php-mailing-list-internals-mars-2013?utm_source=rss2&utm_medium=feed&utm_campaign=php-mailing-list-internals-mars-2013 http://blog.pascal-martin.fr/post/php-mailing-list-internals-mars-2013 Tue, 02 Apr 2013 07:00:00 +0200 Pascal MARTIN phpinternals@ <p> </p> <p>Après un <a href="http://blog.pascal-martin.fr/post/php-mailing-list-internals-fevrier-2013">mois de février</a> plutôt chargé, voici mon dépilage d’<code>internals@</code> pour le <strong>mois de mars 2013</strong>, qui a été plus calme, avec <em>seulement</em> 497 mails.</p> <p>Sous forme d’un graphique représentant le nombre de mails par mois sur les trois dernières années, on obtient <em>(l’historique depuis 1998 est disponible <a href="http://blog.pascal-martin.fr/public/internals-php/nombre-de-mails-internals-2013-03-historique-complet.png">ici</a>)</em> :</p> <p><span style="display:block;text-align:center;"><a href="http://blog.pascal-martin.fr/public/internals-php/nombre-de-mails-internals-2013-03.png"><img alt-src="data:image/gif;base64,R0lGODdhAQABAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAAQABAAAIBAChBQQAOw==" alt="Nombres de mails sur internals@ ces trois dernières années" class="lazy" src="http://blog.pascal-martin.fr/public/internals-php/small-nombre-de-mails-internals-2013-03.png" width="448px" height="298px"></a></span></p> <p>Pour résumer de façon très rapide les quelques points principaux :</p> <ul> <li> <strong>PHP 5.5 est passé en phase de <code>beta</code></strong>, avec la <code>beta2</code> publiée le 28 mars, </li> <li>Cette phase de <code>beta</code> signifie la <strong>fin de l’ajout de fonctionnalités</strong> à PHP 5.5.</li> <li>Zend Optimizer+ sera publié avec PHP 5.5, en tant que <code>ext/opcache</code>.</li> </ul> <p><br></p> <p>PHP 5.5.0 <code>alpha6</code> <a href="http://news.php.net/php.internals/66544">a été publiée</a> le 7 mars ; il était prévu que la version <code>beta1</code> sorte ce jour-là, mais suite aux discussions encore en cours autour de l’intégration de Zend Optimizer+, il a été décidé de sortir une dernière version <code>alpha</code>.</p> <p>Le 19 mars, David Soria Parra <a href="http://news.php.net/php.internals/66702">a annoncé</a> la <strong>“Feature Freeze” de PHP 5.5 : plus aucune nouvelle fonctionnalité ne peut être ajoutée à cette version</strong> de PHP : les RFC en cours de vote pourront être mergées sur la branche PHP 5.5, mais les futures devront cibler PHP 5.6. Bien sûr, les corrections de bugs sont bienvenues sur PHP 5.5.</p> <p><strong>PHP 5.5.0 <code>beta1</code></strong> <a href="http://news.php.net/php.internals/66735">a été publiée</a> le 21 mars, <a href="http://news.php.net/php.internals/66852">suivie</a> d’une version <strong><code>beta2</code></strong> le 28 mars. Il est donc largement temps pour chacun d’entre nous de commencer à <strong>tester cette version</strong>, pour valider qu’elle n’introduit pas de bug ni de régression pour nos applications ou les bibliothèques et frameworks que nous manipulons tous les jours.</p> <p>Après avoir lu le fichier <code>UPGRADING</code> de PHP 5.5, Andi Gutmans <a href="http://news.php.net/php.internals/66743">s’est interrogé</a> sur la <strong>fin du support de Windows XP</strong> <em>(j’évoquais ce sujet, parmi d’autres, en novembre 2012, dans <a href="http://blog.pascal-martin.fr/post/php-5.5-bc-breaks">En route vers PHP 5.5 : Quelques backward-compatible breaks</a>)</em>, qui <a href="http://news.php.net/php.internals/66744">était prévue</a> dès la sortie de PHP 5.4, et a fait remarquer que certains points présentés comme des BC-breaks ne devaient pas avoir d’impact pour les utilisateurs de PHP <em>(s’agissant de points internes)</em> et devraient donc être notés un peu plus loin dans le document, de façon à ne pas décourager ceux qui voudraient migrer vers PHP 5.5.</p> <p><br></p> <p>A propos de Zend Optimizer+, Zeev Suraski <a href="http://news.php.net/php.internals/66531">a annoncé</a> que la période de votes était terminée, et que 44 votes sur 70 étaient en faveur de l’intégration d’O+ à PHP 5.5 ; il en a profité pour dire que le préfixe des directives de configuration correspondantes serait certainement <code>opcache.</code> ; et qu’il restait à décider si le cache d’opcodes serait ou non activé par défaut. <br>Je n’entre pas dans les détails, mais la discussion a été un peu houleuse, comme <a href="http://news.php.net/php.internals/66438">le montrent</a> <a href="http://news.php.net/php.internals/66439">par exemple</a> <a href="http://news.php.net/php.internals/66552">ces quelques</a> <a href="http://news.php.net/php.internals/66537">mails</a>.</p> <p>En conséquence, le 15 mars, Dmitry Stogov <a href="http://news.php.net/php.internals/66633">a annoncé</a> qu’il allait <strong>merger Zend Optimizer+ vers PHP 5.5</strong>, avec, <a href="http://news.php.net/php.internals/66638">au passage</a> un renommage en <strong><code>ext/opcache</code></strong> — y compris pour les directives de configuration <code>.ini</code>.</p> <p>En parallèle, plusieurs développeurs ont commencé à utiliser O+ pour le tester, et rapporter des bugs dès maintenant — y compris <a href="http://news.php.net/php.internals/66408">sous Windows</a>. D’autre part, comme Reeze Xia <a href="http://news.php.net/php.internals/66418">l’a fait remarquer</a>, il serait bon que O+ continue d’être distribué sous forme de paquet PECL, pour PHP 5.3 et 5.4.</p> <p><code>ext/opcache</code> proposant une fonctionnalité de cache d’opcode, mais pas de cache de données utilisateur <em>(contrairement à APC qui proposait les deux)</em>, plusieurs extensions sont en cours de développement pour mettre en place un cache de données en mémoire partagée, accessible par les différents processus PHP. Pour l’instant, Laruence <a href="http://news.php.net/php.pecl.dev/10454">a parlé</a> de <a href="https://github.com/laruence/yac">YAC</a>, et Joe Watkins <a href="http://news.php.net/php.pecl.dev/10469">est parti</a> sur <a href="https://github.com/krakjoe/apcu">APCu</a>. A voir dans les prochaines semaines comment ces deux extensions évolueront.</p> <p><br></p> <p>Suite à une demande de Fabien Potencier qui souhaitait pouvoir voter sur des RFC, Hannes Magnusson <a href="http://news.php.net/php.internals/66395">a demandé</a> qui avait le <strong>droit de voter sur des RFC</strong> : il semblerait que les choses n’aient jamais été très claires à ce niveau.</p> <p>Tout d’abord, techniquement, <a href="http://news.php.net/php.internals/66406">il semblerait</a> que n’importe qui ayant le droit de créer une RFC ait aussi le droit de voter.</p> <p>D’après Pierre Joye, <a href="http://news.php.net/php.internals/66400">il apparaitrait</a> que les contributeurs à php.net aient le droit de vote <em>(ça ne semble pas surprenant)</em>, mais que ce soit aussi le cas pour les responsables reconnus de “projets” <em>(dont la définition n’est <a href="http://news.php.net/php.internals/66404">pas très claire</a>)</em>. Comme <a href="http://news.php.net/php.internals/66403">l’a souligné</a> Derick Rethans en réponse, cela ne semble pas plus clair comme règle, et il serait bon d’avoir une liste un peu plus stricte de personnes autorisées à voter.</p> <p>Dans la suite de la conversation, on en est arrivé à <a href="http://news.php.net/php.internals/66406">des</a> <a href="http://news.php.net/php.internals/66407">avis</a> qui remettent en question le principe de voter par le biais de RFC, regrettant <em>l’ancienne époque</em> des votes sur la mailing-list — qui permettaient à tout et à chacun de voter, mais qui, en même temps, donnaient peut-être parfois un peu plus de poids à ceux qui participent régulièrement à <code>internals@</code>.</p> <p>D’ailleurs, <a href="http://news.php.net/php.internals/66412">la réponse</a> postée par Leigh allait aussi dans le sens “ceux qui participent à <code>internals@</code> et fixent des bugs devraient avoir plus de poids” — notamment par opposition à ceux qui travaillent uniquement côté userland <em>(donc, ceux qui utilisent PHP)</em>. On retombe une fois de plus sur l’opposition <em>développeurs de PHP</em> vs <em>utilisateurs de PHP</em>, fréquemment rencontrée sur <code>internals@</code>.</p> <p><br></p> <p>Derick Rethans <a href="http://news.php.net/php.internals/66448">a annoncé</a> avoir renommé le fichier <code>NEWS</code> de chaque branche correspondant à une version de PHP, pour qu’ils portent chacun un nom spécifique ; ce afin, à ses yeux, de faciliter les opérations lors de merges entre branches.</p> <p>Sans attendre, Gustavo Lopes <a href="http://news.php.net/php.internals/66449">a fait remarquer</a> que cela ne résolvait aucun “problème”, et qu’une solution était déjà connue et documentée, alors que Stas Malyshev et Pierre Joye <a href="http://news.php.net/php.internals/66451">faisaient</a> <a href="http://news.php.net/php.internals/66459">noter</a> qu’il aurait pu être intéressant d’en discuter avant d’effectuer ce renommage sans en parler à personne auparavant.</p> <p>Finalement, Stas Malyshev a annulé cette modification ; mais il s’agit encore d’un élément qui pousse à croire que certains font un peu ce qu’ils veulent comme ils veulent, indépendamment des processus que les autres essayent de mettre en place…</p> <p><br></p> <p>Bob Weinand <a href="http://news.php.net/php.internals/66500">a rédigé</a> la <a href="https://wiki.php.net/rfc/unset_bool">RFC: <code>unset()</code>: return bool if the variable has existed</a>, où il proposait que <code>unset()</code> retourne <code>true</code> si la deletion a réussi, et <code>false</code> si elle a échoué <em>(typiquement, s’il n’y avait rien à “unsetter”)</em></p> <p>Sans me prononcer sur la fonctionnalité proposée, je dois dire que j’apprécie les échanges de mails qu’il y a eu, et la manière dont la RFC a été enrichie au fur et à mesure de ceux-ci, avec des cas d’usage, des résultats de benchmarks, des informations quant à l’implémentation, …</p> <p>Cela dit, au bout de quelques jours, il n’y a plus eu aucun mail posté autour du sujet, qui en est à plus de vingt jour sans échange… A voir au cours des prochains mois si les choses évolueront <em>(de toute façon, une nouvelle fonctionnalité comme celle-ci ne risquait pas d’arriver dans PHP 5.5)</em>.</p> <p><br></p> <p>Peut-être un peu brutalement, Steve Clay <a href="http://news.php.net/php.internals/66643">a lancé</a> un sujet de discussion où il semblait qu’il demandait s’il était possible de tuer <code>call_user_func()</code> — il a par la suite <a href="http://news.php.net/php.internals/66647">reformulé sa question</a>, en indiquant qu’il aurait souhaité que les <em>callables</em> puissent systématiquement être appelées directement, et il a apporté plus de précisions dans <a href="http://news.php.net/php.internals/66736">ce mail</a>.</p> <p>En réponse, Nikita Popov <a href="http://news.php.net/php.internals/66648">a indiqué</a> qu’il existait déjà quelques solutions, notamment pour PHP &gt;= 5.4, alors que Anthony Ferrara <a href="http://news.php.net/php.internals/66653">faisait remarquer</a> qu’il existait d’autres cas pour lesquels un appel direct n’est pas autorisé, même s’il est possible de tricher avec des syntaxes du type <code>${'_'.!$_=getCallback()}()</code><sup id="fnref:appel-fonction-exemple"><a href="#fn:appel-fonction-exemple">1</a></sup> — et pour ce second point, Stas Malyshev <a href="http://news.php.net/php.internals/66655">a indiqué</a> qu’il existait une RFC pour cela : <a href="https://wiki.php.net/rfc/fcallfcall">RFC: Function call chaining</a>.</p> <p><br></p> <p>Depuis l’ajout “sauvage” <em>(sans passage par le processus de RFC, et qui plus est, après peu de discussions)</em> il y a quelques mois de la classe <code>DateTimeImmutable</code>, l’idée qu’elle ne fait pas <em>ce qu’elle devrait</em> ou qu’elle ne le fait pas <em>comme elle devrait</em> revient assez souvent sur le devant de la scène, au point que Nikita Popov <a href="http://news.php.net/php.internals/66495">a fini par proposer</a> que l’ajout de cette classe soit annulé tant qu’il en est encore temps, pour éviter d’ajouter une classe dysfonctionnelle à PHP 5.5. S’est <a href="http://news.php.net/php.internals/66814">alors posée</a> la question de “comment supprimer une fonctionnalité qui n’est pas passé par une RFC alors qu’elle aurait dû”<sup id="fnref:datetimeimmutable"><a href="#fn:datetimeimmutable">2</a></sup> ^^</p> <p>Suite à ces quelques mails, et pour compléter les échanges, Michael Wallner <a href="http://news.php.net/php.internals/66822">a lancé</a> un sujet de discussion où il a indiqué ne pas être satisfait du fait que <strong><code>DateTimeImmutable</code> hérite de <code>DateTime</code></strong>. Après plusieurs mails partant sur autant d’idées différentes, Pierre Joye <a href="http://news.php.net/php.internals/66832">a rappelé</a> que la marche à suivre était de créer une RFC, ce à quoi plusieurs voix <a href="http://news.php.net/php.internals/66835">ont</a> <a href="http://news.php.net/php.internals/66837">répondu</a> que c’était effectivement la chose à faire, mais qu’il ne fallait pas publier <code>DateTimeImmutable</code> telle qu’elle est à présent inclue dans PHP 5.5.</p> <p>Cela dit, en fin de mois, Derick Rethans <a href="http://news.php.net/php.internals/66848">semblait refuser</a> d’annuler l’ajout de cette classe <code>DateTimeImmutable</code>. Nous verrons dans les prochaines semaines comment les choses évolueront, si l’architecture de cette classe sera revue, si son ajout sera finalement annulé, ou si elle sortira en l’état…</p> <p><br></p> <p>J’évoquais <a href="http://blog.pascal-martin.fr/post/php-mailing-list-internals-fevrier-2013">en février</a> l’idée que certains avaient de réaliser un sondage, pour permettre aux développeurs de PHP de connaitre un peu mieux les besoins de leurs utilisateurs. Paul Reinheimer a continué à travailler sur le sujet, et <a href="http://news.php.net/php.internals/66471">a proposé</a> une première série de questions.</p> <p>La bibliothèque PCRE <a href="http://news.php.net/php.internals/66450">a été montée</a> en version 8.32 sur toutes les branches de développement.</p> <p>La <a href="https://wiki.php.net/rfc/cli_process_title">RFC: PHP CLI changing process title support</a> qui avait été ouverte aux votes le mois dernier <a href="http://news.php.net/php.internals/66472">est passée</a>, avec 28 votes “pour”, et 1 vote “contre” ; la fonctionnalité a été intégrée à PHP 5.5.</p> <p>La <a href="https://wiki.php.net/rfc/foreach-non-scalar-keys">RFC: Allow non-scalar keys in <code>foreach</code></a> qui avait été ouverte aux votes en fin de mois dernier <a href="http://news.php.net/php.internals/66494">est elle aussi passée</a>, avec 21 votes “pour”, et 0 vote “contre”. Suite à cette annonce, quelques échanges ont eu lieu, en particulier entre Nikita Popov, auteur de la RFC et du patch l’accompagnant, et Dmitry Stogov, visant à améliorer ledit patch. La fonctionnalité a été mergée vers PHP 5.5.</p> <p>Là aussi dans la suite logique de ce que je disais le mois dernier, les votes <a href="http://news.php.net/php.internals/66620">ont été ouverts</a> sur la <a href="https://wiki.php.net/rfc/trailing-comma-function-args">RFC: Trailing comma function args</a>. Pour l’instant, les choses semblent relativement mal parties, avec 15 votes “pour” et 20 votes “contre”, alors que la fonctionnalité décrite semblait initialement intéresser du monde — mais comme <a href="http://news.php.net/php.internals/66662">l’a souligné</a> Sara Golemon, c’est aussi à ça que sert le processus de RFC.</p> <p>Richard Bradley <a href="http://news.php.net/php.internals/66716">a lancé</a> l’idée de transformer l’<code>E_ERROR</code> obtenue lors de l’appel d’une méthode sur une variable valant <code>null</code> en <code>E_RECOVERABLE_ERROR</code>, afin que le script PHP ayant provoqué l’erreur puisse l’intercepter et la gérer. Au vu des quelques échanges qui ont suivi, on peut espérer qu’une RFC soit rédigée dans les prochaines semaines.</p> <p>Stas Malyshev <a href="http://news.php.net/php.internals/66861">a rédigé</a> la <a href="https://wiki.php.net/rfc/secure_unserialize">RFC: Secured <code>unserialize()</code></a>. En réponse, Anthony Ferrara <a href="http://news.php.net/php.internals/66862">s’est demandé</a> s’il valait mieux essayer de sécuriser le principe de sérialisation/désérialisation, ou s’il était plus judicieux de recommander l’utilisation d’un autre format de données <em>(comme JSON ou XML)</em>, interoppérable, lors d’échange d’informations.</p> <p>Et pour finir, Nikita Popov <a href="http://news.php.net/php.internals/66805">a commencé</a> à faire une passe sur l’implémentation des <a href="http://blog.pascal-martin.fr/post/php-5.5-generators">Generators de PHP 5.5</a>, et a demandé s’il ne faudrait pas supprimer le support de leur clonage. La seule <a href="http://news.php.net/php.internals/66856">réponse postée</a> va dans le sens de cette proposition.</p> <p><br></p> <hr> <p><strong><code>internals@lists.php.net</code></strong> est la <strong>mailing-list des développeurs de PHP</strong> ; elle est utilisée pour discuter des prochaines évolutions du langage, ainsi que pour échanger autour de suggestions d’améliorations ou de rapports de bugs. <br>Elle est publique, et tout le monde peut s’y inscrire depuis la page <a href="http://www.php.net/mailing-lists.php#internals">Mailing Lists</a>, ou consulter ses archives en HTTP depuis <a href="http://news.php.net/php.internals">php.internals</a> ou depuis le serveur de news <a href="news:/php.internals"><code>news://news.php.net/php.internals</code></a>.</p> <p><br></p> <div class="footnotes"> <hr> <ol> <li id="fn:appel-fonction-exemple"> <p>Je suis assez d’accord avec <a href="http://news.php.net/php.internals/66661">Sara Golemon</a> et <a href="http://news.php.net/php.internals/66683">Julien Pauli</a> : cette <em>solution</em> est <em>dingue</em> — mais plutôt sympa à lire ^^ <a href="#fnref:appel-fonction-exemple">↩</a></p> </li> <li id="fn:datetimeimmutable"> <p>Considérant les échanges de ces derniers mois autour de la classe <code>DateTimeImmutable</code>, et le fait qu’il l’ait commitée sauvagement sans passer par une RFC, la logique <a href="http://news.php.net/php.internals/66817">voudrait</a> que Derick Rethans annule cet ajout… Je suis curieux de voir ce que cela va donner sur les prochains semaines, maintenant que PHP 5.5 est feature-frozen, cela dit… <a href="#fnref:datetimeimmutable">↩</a></p> </li> </ol> </div> http://blog.pascal-martin.fr/post/php-mailing-list-internals-mars-2013#comment-new-form http://blog.pascal-martin.fr/post/php-mailing-list-internals-mars-2013#comment-new-form Ce mois-ci sur internals@php - Février 2013 http://blog.pascal-martin.fr/post/php-mailing-list-internals-fevrier-2013?utm_source=rss2&utm_medium=feed&utm_campaign=php-mailing-list-internals-fevrier-2013 http://blog.pascal-martin.fr/post/php-mailing-list-internals-fevrier-2013 Mon, 11 Mar 2013 07:00:00 +0100 Pascal MARTIN phpinternals@ <p> </p> <p>Après un <a href="http://blog.pascal-martin.fr/post/php-mailing-list-internals-janvier-2013">mois de janvier</a> agité sur <code>internals@</code>, voici <strong>février 2013</strong>, qui n’a pas non plus été de tout repos !</p> <p>Sous forme d’un graphique représentant le nombre de mails par mois sur les trois dernières années, on obtient <em>(l’historique depuis 1998 est disponible <a href="http://blog.pascal-martin.fr/public/internals-php/nombre-de-mails-internals-2013-02-historique-complet.png">ici</a>)</em> :</p> <p><span style="display:block;text-align:center;"><a href="http://blog.pascal-martin.fr/public/internals-php/nombre-de-mails-internals-2013-02.png"><img alt-src="data:image/gif;base64,R0lGODdhAQABAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAAQABAAAIBAChBQQAOw==" alt="Nombres de mails sur internals@ ces trois dernières années" class="lazy" src="http://blog.pascal-martin.fr/public/internals-php/small-nombre-de-mails-internals-2013-02.png" width="448px" height="298px"></a></span></p> <p>Pour résumer de façon très rapide les quelques points principaux :</p> <ul> <li> <strong>PHP 5.5 continue d’avancer</strong> : une version <code>alpha5</code> a été publiée, et la sortie de la version <code>beta1</code> a été repoussée.</li> <li>Le <strong>vote sur l’intégration de Zend Optimizer+ à PHP 5.5</strong> a été ouvert en fin de mois.</li> <li>Plusieurs <em>petites</em> RFC ont été rédigées ; pas de grosse nouveauté cela dit — ce qui peut se comprendre, puisque le focus du moment est la sortie prochaine de PHP 5.5.</li> </ul> <p><br></p> <h1>PHP 5.5 : Avancement</h1> <p>La sortie de PHP 5.5 continue de se rapprocher doucement, mais de plus en plus sûrement, avec la sortie d’une version <code>alpha5</code>, et de longues discussions autour du composant Zend Optimizer+ et de sa possible intégration à PHP 5.5.</p> <h2>PHP 5.5 : roadmap, alpha5, future beta1 ?</h2> <p>Je disais <a href="http://blog.pascal-martin.fr/post/php-mailing-list-internals-janvier-2013">il y a un mois</a> que, suite aux échanges survenus fin janvier autour de la possible intégration d’un cache d’opcodes à PHP 5.5, il se pourrait que cette version soit repoussée — autrement dit, que la <code>beta1</code> ne soit pas publiée le 7 février comme initialement prévu.</p> <p>Et effectivement, tout juste à la mi-février, Julien Pauli et David Soria Parra <a href="http://news.php.net/php.internals/65865">ont effectué</a> les annonces suivantes :</p> <ul> <li>Une version <code>alpha5</code> doit être publiée le 21 février, intégrant Zend Optimizer+, extension qui aura été mergée au coeur de PHP d’ici là, </li> <li>La <code>beta1</code> est repoussée au 7 mars — soit un mois après la date initialement prévue,.</li> </ul> <p>Les réactions ne se sont pas faites attendre : <a href="http://news.php.net/php.internals/65867">plusieurs</a> <a href="http://news.php.net/php.internals/65877">voix</a> se <a href="http://news.php.net/php.internals/65875">sont élevées</a>, indiquant que le vote sur la <a href="https://wiki.php.net/rfc/optimizerplus">RFC: Integrating Zend Optimizer+ into the PHP distribution</a> n’avait pas encore eu lieu, et qu’il semblait donc “prématuré” d’annoncer dès maintenant l’intégration de cette extension <em>(intégration qui n’a pas été votée !)</em> ; et aussi que ce planning ne laissait que peu de temps pour tester avant le passage en phase de <code>beta</code>.</p> <p>Heureusement, David Soria Parra a <a href="http://news.php.net/php.internals/65878">rapidement apporté quelques clarifications</a> :</p> <ul> <li>Les deux release managers pensent que l’intégration d’un cache d’opcode est importante, et espèrent donc que la RFC va passer.</li> <li>Ils ont donc souhaité rallonger la phase de versions <code>alpha</code> pour permettre le merge de Zend Optimizer+ au coeur de PHP avant le passage en phase de <code>beta</code>, </li> <li>Mais l’intégration de Zend Optimizer+ à PHP 5.5 n’aura lieu que si la RFC est acceptée.</li> </ul> <p>Le 22 février, soit une semaine après cette annonce, la <strong>version <code>alpha5</code> de PHP 5.5 <a href="http://news.php.net/php.internals/66149">a été publiée</a></strong>. <br>Finalement, <strong>ZendOptimizer+ n’a pas été intégré à cette version</strong>, qui n’a apportée que quelques corrections de bugs et améliorations <em>(autour de l’extension <code>mysqli</code> et de <code>mysqlnd</code>, notamment)</em>.</p> <p>La sortie de la première version <code>beta</code> <em>(qui signifie la fin de l’ajout de fonctionnalités à PHP 5.5)</em> approchant, Pierre Joye <a href="http://news.php.net/php.internals/66182">a demandé</a>, en toute fin de mois, à ce que les prochaines RFC, pull-requests, et suggestions d’ajout de fonctionnalités visent PHP 5.6 — et plus PHP 5.5.</p> <p><br></p> <h2>PHP 5.5 et Zend Optimizer+</h2> <p>Comme je l’évoquais <a href="http://blog.pascal-martin.fr/post/php-mailing-list-internals-janvier-2013">il y a quelques semaines</a>, toute fin janvier, Zeev Suraski annonçait la <a href="https://wiki.php.net/rfc/optimizerplus">RFC: Integrating Zend Optimizer+ into the PHP distribution</a> ; l’idée étant d’open-sourcer le cache d’opcodes Zend Optimizer+ <em>(jusqu’à présent gratuit, mais closed-source)</em> afin de l’intégrer à PHP, même si cela pouvait signifier devoir repousser la sortie de PHP 5.5 de deux mois.</p> <p>Quelques mails supplémentaires ont été échangés en février sur ce fil de discussion, sans apporter beaucoup plus d’informations, mais continuant à indiquer que le sujet intéresse du monde. Au bout de quelques jours, un tier du mois étant passé, Zeev Suraski <a href="http://news.php.net/php.internals/65780">a indiqué</a> que le processus prenait un peu plus de temps que prévu, mais que la première version des sources devrait arriver incessamment sous peu.</p> <p>Et effectivement, le lendemain, Zeev Suraski <a href="http://news.php.net/php.internals/65786">a annoncé</a> que les sources de Zend Optimizer+ étaient disponible sur <a href="https://github.com/zend-dev/ZendOptimizerPlus/">github/zend-dev/ZendOptimizerPlus/</a> — l’extension en elle-même étant compatible avec toutes les versions de PHP allant de 5.2 à 5.5-dev. Il en a profité pour indiquer qu’il était possible d’organiser un webinar, afin de faciliter la prise en main du code de l’extension et de son fonctionnement par d’autres développeurs <em>(idée qui a semblé interresser du monde — ce qui ne peut être qu’une bonne chose : plus il y a de développeurs connaissant le code, mieux il sera revu et testé)</em>.</p> <p>En réponse à une <a href="http://news.php.net/php.internals/65806">série de questions</a> de Christopher Jones, Zeev Suraski <a href="http://news.php.net/php.internals/65830">a apporté</a> quelques informations supplémentaires :</p> <ul> <li>D’après lui, le cache d’opcodes devrait être activé par défaut — si O+ est intégré à PHP, bien sûr.</li> <li>O+ est capable d’effectuer quelques optimisations — d’ailleurs, ces optimisations pouvant être coûteuses à réaliser, il semble cohérent de les coupler avec un cache d’opcodes.</li> <li>En l’état actuel des choses <em>(et comme pour APC, d’ailleurs)</em>, il n’y a pas de caching d’opcode en CLI, puisque le processus est détruit une fois le script exécuté : la mémoire ne persiste pas “en dehors” de PHP.</li> </ul> <p>Plus loin dans la discussion se sont posées quelques questions supplémentaires :</p> <ul> <li>Quel nom utiliser pour cette extension ? Y compris si elle est intégrée à PHP ? Considérant que ce nom doit être explicite, et sera aussi probablement utilisé pour une série de paramètres dans <code>php.ini</code>. Sur ce point, Zeev Suraski <a href="http://news.php.net/php.internals/65881">est tout à fait d’accord</a> pour qu’un autre nom que “Zend Optimizer+” soit utilisé.</li> <li>Quelles valeurs par défaut utiliser pour ces différents paramètres ? Des valeurs plutôt “prudentes”, ou plutôt orientées “performances extrêmes” ?</li> </ul> <p>D’autres échanges de mails indiquent que plusieurs développeurs ont compilé et/ou essayé l’extension :</p> <ul> <li>Pierre Joye <a href="http://news.php.net/php.internals/65809">l’a compilée</a> pour Windows <em>(quelques correctifs <a href="http://news.php.net/php.internals/65813">ont été apportés</a> au passage — à peine open-source, et déjà des pull-requests ;-) )</em>,</li> <li> <a href="http://news.php.net/php.internals/65810">Il semblerait</a> qu’il puisse effectivement <em>(c’était prévu)</em> y avoir <a href="http://news.php.net/php.internals/65859">quelques soucis</a> avec ZTS.</li> </ul> <p>Après deux semaines d’échanges, les votes <a href="http://news.php.net/php.internals/66277">ont été ouverts</a> sur la <a href="https://wiki.php.net/rfc/optimizerplus">RFC: Integrating Zend Optimizer+ into the PHP distribution</a> à la toute fin du mois.</p> <p><br></p> <p>Quelques jours après la publication des sources de Zend Optimizer+, Pierre Joye <a href="http://news.php.net/php.internals/65852">a publié</a> les <a href="http://windows.php.net/downloads/snaps/ostc/pftt/perf/results-20130213-5.4.11-5.5.0devvc11.html">résultats de quelques benchmarks</a> sous Windows ; il en a d’ailleurs profité pour suggérer qu’il serait intéressant de publier l’extension sur PECL rapidement, afin d’augmenter le nombre de testeurs.</p> <p>Les premiers résultats semblaient <a href="http://news.php.net/php.internals/65862">remonter quelques problèmes</a> avec Symfony <em>(les différences pour Mediawiki pouvant — en partie ? — être expliquées par le fait qu’<a href="http://news.php.net/php.internals/65864">O+ n’intégre pas de cache de données</a>, contrairement à APC et à Wincache : Zend Optimizer+ ne fait que du caching d’opcodes.)</em>. Un correctif <a href="http://news.php.net/php.internals/65876">a été apporté</a>, qui semble avoir amélioré les choses.</p> <p>Ces benchmarks devraient être joués régulièrement, et les <a href="http://windows.php.net/downloads/snaps/ostc/pftt/perf/">résultats sont disponibles</a> en ligne.</p> <p><br></p> <p>Pour ceux qui voudraient tester O+ sur un environnement de développement où ils auraient aussi Xdebug, notez qu’il <a href="http://news.php.net/php.internals/65837">semble</a> <a href="http://news.php.net/php.internals/65839">falloir</a> charger Zend Optimizer+ avant Xdebug — les choses fonctionnant moins bien si l’extension Xdebug est chargée en premier.</p> <p>Ralph Schindler a fait quelques tests avec des archives Phar, et <a href="http://news.php.net/php.internals/65564">a répondu</a> à un mail qu’il avait lui-même envoyé y a quelques mois, en notant que O+ ne semble pas souffrir de certains problèmes qu’il avait rencontré avec APC pour les <code>stat</code>/<code>include</code> avec des Phar.</p> <p><br></p> <h1>Give the Language a Rest motion</h1> <p>Probablement suite aux nombreuses conversations de ces derniers mois à propos de modifications qui pourraient être à apporter à la syntaxe de PHP ou de nouveautés <em>indispensables</em> d’après certains, Derick Rethans <a href="http://news.php.net/php.internals/66065">a renvoyé</a> un <strong>mail que Zeev Suraski avait initialement posté en mars 2006</strong>.</p> <p>Déjà à ce moment là, Zeev Suraski estimait qu’il n’était pas judicieux de vouloir sans-cesse continuer à altérer la syntaxe de PHP pour ajouter de nouvelles fonctionnalités qui semblaient perçues comme indispensables par seulement un petit nombre.</p> <p>Pierre Joye a rapidement <a href="http://news.php.net/php.internals/66068">profité de l’occasion</a> pour rappeler qu’il serait bon pour les développeurs de PHP de se rapprocher des différentes communautés utilisant le langage, afin d’être plus en mesure de comprendre leurs besoins.</p> <p><a href="http://news.php.net/php.internals/66080">La réponse</a> de Lars Strojny est intéressante : d’après lui, il bien entendu important de ne pas ajouter de fonctionnalité seulement à moitié réfléchie, mais il faut continuer à implémenter des nouveautés, pour que ce qui est <strong>faisable avec d’autres langages le soit aussi en PHP</strong>, pour permettre aux développeurs de travailler avec une <strong>syntaxe concise</strong>, ainsi que pour apporter des nouveautés les aidant, alors qu’ils ne pensaient même pas qu’ils en auraient besoin. <a href="http://news.php.net/php.internals/66080">Son mail</a> comportait aussi un résumé un peu macro des nouveautés, en termes de syntaxe, apportées par les quelques dernières versions de PHP.</p> <p>Cela dit, le <a href="http://news.php.net/php.internals/66097">point de vue</a> de Zeev Suraski se défend aussi : comme il le souligne, <strong>ajouter de nouvelles fonctionnalités rend le langage de plus en plus complexe</strong>, et, par conséquent, moins accessible à de nouveaux développeurs <em>(j’ajouterais qu’il est facile d’oublier ce point lorsque l’on travaille quotidiennement avec PHP depuis des annéees et que l’on suit ses évolutions au fur et à mesure de leur sortie)</em> ; et en même temps, chaque nouvelle fonctionnalité ajoute de la complexité dans le moteur de PHP, rendant potentiellement sa maintenance plus difficile. <br>Je ne peux d’ailleurs que sourire lorsque je lis le passage suivant, qui fait sans aucun doute référence à Perl<sup id="fnref:perl"><a href="#fn:perl">1</a></sup><em>(d’aucun diront que ça peut sonner un peu “arrogant”, mais, en même temps, c’est plutôt vrai, non ?)</em> :</p> <blockquote> <p>There used to be a language that was the Queen of the Web. It was full of <br>clever syntax. It prided itself on having a variety of expressive ways of <br>doing the same thing. You’re on the mailing list of the language that <br>dethroned it.</p> </blockquote> <p>D’un autre côté, la notion de “retour sur investissement” est perçue différemment par chacun, et là où certaines fonctionnalités sont perçues comme inutiles par l’un, elles sont fortement attendues par d’autres — je pense par exemple aux annotations ou aux getters/setters dont j’ai parlé plusieurs fois ces derniers mois — et comme <a href="http://news.php.net/php.internals/66099">l’a souligné</a> Pierre Joye, il est absolument nécessaire d’arriver à des <strong>compromis</strong> entre la <strong>simplicité qui était attendue dans les années 2000</strong>, et les <strong>besoins du développement “moderne”</strong>.</p> <p>Rasmus Lerdorf a ensuite <a href="http://news.php.net/php.internals/66117">apporté un point de vue</a> différent : là où le débat se focalisait jusqu’à présent sur des évolutions en termes de fonctionnalités, il ne faut pas oublier que pour certains, les nouvelles fonctionnalités et changements syntaxiques ne sont pas forcément désirés, et que des <strong>optimisations orientées performances</strong> sont beaucoup plus attendues — alors que le sujet des performances n’est que rarement abordé sur <code>internals@</code>, contrairement aux idées de fonctionnalités !</p> <p>Et en même temps, comme <a href="http://news.php.net/php.internals/66108">l’a souligné</a> <em>(entre autres)</em> Florin Razvan Patan, il serait aussi bon de se concentrer sur la <strong>fiabilité et la robustesse du langage</strong> : lorsqu’une nouvelle version apporte son lots de BC-breaks <em>(si je puis me permettre de nuancer : il n’y en n’a pas non plus eu tant que ça avec PHP 5.4 ; et il n’y en n’a pas tant que ça de prévus pour PHP 5.5)</em> et que des extensions critiques ne sont pas fonctionnelles avant presque un an, il ne faut pas s’étonner si elle n’est adoptée qu’extrêmement lentement — la suite de son mail est intéressante, il y évoquait différents points en rapport avec le trop faible nombre de contributeurs à PHP, et quelques idées qui pourraient aider à améliorer les choses.</p> <p><br></p> <h1>Versionner le langage pour réduire les bc-breaks ?</h1> <p>Le mois a commencé fort, avec une discussion de plus de 45 mails lancée par Karoly Negyesi, où il <a href="http://news.php.net/php.internals/65566">suggèrait initialement</a> que, pour faciliter la migration vers PHP 6, cette version devrait se baser sur des <strong>tags <code>&lt;?php</code> incluant la version du langage, comme <code>&lt;?php6</code></strong>.</p> <p>Cette idée n’est pas nouvelle, et il n’y a d’après Pierre Joye <strong><a href="http://news.php.net/php.internals/65567">aucune chance</a> d’y revenir</strong> ; il n’est d’ailleurs <a href="http://news.php.net/php.internals/65587">pas le seul</a> de <a href="http://news.php.net/php.internals/65590">cet avis</a>.</p> <p>Comme Rasmus Lerdorf <a href="http://news.php.net/php.internals/65585">le souligne</a>, il n’est pas réaliste de considérer qu’aucune cassure de compatibilité antérieure ne doit avoir lieu entre deux versions <em>— y compris mineures —</em> de PHP : cela signifierait que même les bugs ne doivent pas être corrigés <em>(puisque ces corrections signifient un changement de comportement)</em>. Dans les grandes lignes, l’approche retenue pour PHP est qu’il ne doit pas y avoir de changement sur un comportement fonctionnel documenté, à moins qu’il n’y ait une raison extrêmement sérieuse <em>(en général, liée à une problématique de sécurité)</em> de le faire.</p> <p>Un peu plus loin dans la conversation, cela dit, Karoly Negyesi <a href="http://news.php.net/php.internals/65658">a expliqué</a> son point de vue et le pourquoi de sa proposition : on retombe sur le problème des hébergeurs <em>(y compris mutualisés, qui représentent une part non-négligeable, au contraire, des systèmes sur lesquels sont déployés nombre de CMS)</em> et distributions <em>(comme la dernière Ubuntu LTS qui est encore en PHP 5.3 et ne propose toujours pas PHP 5.4)</em> ne mettant pas PHP à jour, et continuant à proposer d’anciennes versions à leurs clients / utilisateurs. <br>En somme, à ses yeux, il faudrait que tout code écrit pour PHP 5.4 fonctionne sans erreur sur PHP 5.5 ; ce à quoi Rasmus Lerdorf <a href="http://news.php.net/php.internals/65659">a fort justement répondu</a> que la première chose à faire, alors, serait de tester avec PHP 5.5 <em>(ce serait même un bon moyen, peu coûteux en temps, de <a href="http://news.php.net/php.internals/65680">contribuer au projet PHP</a> !)</em>, même si cette version n’est pas encore sortie en stable — et que chaque version de PHP apporte nécessairement quelques changements.</p> <p>La discussion <a href="http://news.php.net/php.internals/65674">a quelque peu dévié</a> sur les différentes versions de PHP, et sur la baisse de PHP 5.1 vs l’augmentation de PHP 5.4 vs le besoin de migrer vers PHP 5.3, ainsi que sur les <a href="news.php.net/php.internals/65691">méthodes de calcul</a>, avant de revenir sur le besoin qu’<a href="news.php.net/php.internals/65676">expriment certains</a> d’avoir une version “figée” de PHP 5 — et que les développements soient effectués sur une autre version réellement distincte. <br>Mais, en même temps, il <a href="http://news.php.net/php.internals/65678">semble normal</a> qu’une évolution <em>(comme un changement de version d’un composant majeur)</em> de la plate-forme d’hébergement puisse s’accompagner de retouches au code PHP qu’elle fait tourner, non ? <br>Et comme <a href="http://news.php.net/php.internals/65597">l’a noté</a> Thomas Bley, il est tout à fait possible d’utiliser plusieurs versions de PHP en parallèle sur une machine — en particulier avec FPM.</p> <p>Les échanges s’éternisant quelque peu, avec d’un côté quelques participants refusant qu’une nouvelle version de PHP ne change quoi que ce soit<sup id="fnref:php-pas-changement"><a href="#fn:php-pas-changement">2</a></sup> et de l’autre ceux qui considèrent qu’il est impossible d’éviter tout changement, plusieurs voix se sont élevées pour <a href="http://news.php.net/php.internals/65667">signifier</a> que la marche à suivre serait de rédiger une RFC <em>(qui n’a aucune chance de passer)</em>. Et au final, après trois jours de “discussions”, le sujet est retombé.</p> <p><br></p> <h1>Divers / en vrac</h1> <p>Martin Keckeis a <a href="http://news.php.net/php.internals/65609">fait remarquer</a> que la page de <strong><a href="http://www.php.net/usage.php">statistiques d’utilisation</a> de PHP</strong> sur php.net n’était pas à jour <em>(les derniers chiffres datent de 2007)</em> ; Peter Cowburn <a href="http://news.php.net/php.internals/65611">a indiqué</a> en réponse qu’il était en contact avec <a href="http://news.netcraft.com/archives/2013/01/31/php-just-grows-grows.html">netcraft</a>, et qu’il allait voir pour mettre ces statistiques plus régulièrement — presque un mois après, il n’y a pas encore eu de progrès sur ce point.</p> <p>Ce n’est pas un événement en soit, mais ça m’a permis de découvrir le <a href="http://ci.qa.php.net/">Jenkins d’intégration continue de PHP</a> : Ferenc Kovacs <a href="http://news.php.net/php.internals/65569">a demandé</a> un accès au repository git “jenkins” de PHP, pour pouvoir conserver sous gestionnaire de sources la configuration de ce dernier.</p> <p>A propos de <strong>caches d’opcodes</strong>, Terry Ellison <a href="http://news.php.net/php.internals/65692">a souligné</a> que les extensions existantes se focalisaient sur le caching dans un contexte de serveur Web servant de nombreuses requêtes, et ignoraient le cas de scripts lancés en CLI ; il en a profité pour <a href="https://github.com/TerryE/php-extensions/blob/master/lpc/TECHNOTES.txt">introduire</a> son extension <a href="https://github.com/TerryE/php-extensions/tree/master/lpc">LPC</a>, qui pourrait conduire à quelque chose à ce niveau — mail qui n’a été suivi d’absolument aucun retour.</p> <p>Hans-Juergen Petrich <a href="http://news.php.net/php.internals/65573">a lancé</a> une discussion où il remarquait qu’utiliser <code>eval()</code> pour créer des fonctions anonymes<sup id="fnref:eval-lambda"><a href="#fn:eval-lambda">3</a></sup> entraine une fuite mémoire, si les fonctions anonymes créées le sont à partir de chaines de longueurs différentes. Après un peu de recherches à coups de debugger, Terry Ellison <a href="http://news.php.net/php.internals/65671">a noté</a> qu’il semblait s’agir d’un bug.</p> <p>Gabriel Wu <a href="http://news.php.net/php.internals/65681">a annoncé</a> s’être mis à travailler sur l’<strong>extension <a href="http://pecl.php.net/package/operator">operator</a></strong>, dont la dernière mise à jour remontait à 2006, pour, en premier lieu, la rendre <strong>compatible avec PHP 5.3 et PHP 5.4</strong>. L’échanges de mails montre un peu le processus à suivre pour devenir mainteneur d’une extension : travailler dessus, éventuellement montrer un patch ou deux <em>(il semblerait que ça n’ait pas été le cas ici, mais il s’agit d’une extension peu utilisée, qui n’avait plus de mainteneur — ce qui facilite les choses)</em>, demander un compte pecl <em>(pour pouvoir publier des mises à jour de l’extension)</em> et éventuellement un compte php.net <em>(pour héberger les sources sur le repository git correspondant, si on ne veut pas les héberger en externe)</em>, et demander aux plus expérimentés s’ils ont des conseils et retours.</p> <p>Les sources de PHP sont hébergées sur un <a href="http://git.php.net/?p=php-src.git;a=summary">repository git</a>, dont il existe un <a href="https://github.com/php/php-src">miroir sur github</a> — miroir qui reçoit des pull-requests. <br>Là où il existait déjà l’outil <a href="https://qa.php.net/pulls/">Github Pull Requests</a> pour gérer celles-ci et les merger sur le repository officiel, Johannes Schlüter <a href="http://news.php.net/php.internals/65792">a annoncé</a> la mise en place d’un mécanisme les remontant sur le bug-tracker de PHP, en vue de <strong>faciliter le rapprochement entre un bug et une PR</strong> lui correspondant. Encore un bon point pour encourager la soumission de pull-requests, et donc la participation de nouveaux développeurs !</p> <p>Il y a quelques mois, Ferenc Kovacs <a href="http://news.php.net/php.internals/63002">proposait</a> un mail expliquant qui pouvait soumettre des RFC ; ce mois-ci, Christopher Jones <a href="http://news.php.net/php.internals/65805">a complété</a> cette liste, en postant sur son blog : <a href="https://blogs.oracle.com/opal/entry/the_mysterious_php_rfc_process">The Mysterious PHP RFC Process and How You Can Change the Web</a>.</p> <p>Asbjørn_Sannes <a href="http://news.php.net/php.internals/65772">a soumis</a> la <a href="https://wiki.php.net/rfc/mysqlnd_localhost_override">RFC: Add <code>mysqlnd.localhost_override</code> option</a> ; après plusieurs retours plutôt négatifs, dont certains proposant <a href="http://news.php.net/php.internals/65778">d’autres</a> <a href="http://news.php.net/php.internals/65773">solutions</a>, la RFC est retirée.</p> <p>Pour continuer avec une autre RFC, Nikita Popov <a href="http://news.php.net/php.internals/65938">a annoncé</a> qu’il prenait la suite du travail sur la <a href="https://wiki.php.net/rfc/foreach-non-scalar-keys">RFC: Allow non-scalar keys in <code>foreach</code></a>. Il n’y a eu que peu d’échanges sur le fil de discussion <em>(ce qui est généralement bon signe, signifiant que tout le monde est d’accord avec l’idée — puisque personne n’a rien à dire qui s’y oppose)</em>, et le vote <a href="http://news.php.net/php.internals/66295">a été ouvert</a> en fin de mois.</p> <p>Stas Malyshev <a href="http://news.php.net/php.internals/65925">a corrigé</a> le <a href="https://bugs.php.net/bug.php?id=49348">Bug #49348 : Uninitialized ++$foo-&gt;bar; does not cause a notice (but ++$bar; does!)</a> ; à partir de PHP 5.5, utiliser une <strong>incrémentation sur une propriété inexistante</strong>, comme <code>$this-&gt;undefined++</code>, <strong>lévera une <code>E_NOTICE</code></strong> — c’était déjà le cas pour les variables <em>normales</em>.</p> <p><br></p> <p>Nikita Popov <a href="news.php.net/php.internals/66197">a fait remarquer</a> que si PHP 5.4 a introduit la <strong>syntaxe <code>(new MaClass())-&gt;maMethode()</code></strong>, celle-ci ne fonctionne que pour <code>new</code> — et pas pour d’autres instructions, comme, par exemple, <code>clone</code> ; pour rendre les choses plus consistentes, il a <strong>proposé d’étendre cette syntaxe à n’importe quel type d’expression</strong>.</p> <p>La proposition <a href="http://news.php.net/php.internals/66199">a semblé</a> <a href="http://news.php.net/php.internals/66203">intéresser</a> <a href="http://news.php.net/php.internals/66204">du monde</a>, et n’a initialement pas réellement rencontré d’opposition ; le changement proposé semblait même suffisamment peu important pour que certains suggèrent de ne pas passer par les cases “RFC” et “vote” — suggestion qui, elle, a rencontré une certaine opposition <em>(rédiger une RFC fait parti du processus, ça permet de mettre la nouvelle fonctionnalité au clair pour tout le monde, de pointer d’éventuels cas tordus, …)</em> : après tout, il s’agirait de modifier le comportement du parseur, et ce type de changement peut avoir un impact sur de nombreux outils gravitant autour du langage <em>(IDE, analyseurs de code source, …)</em>.</p> <p>Comme l’a par la suite <a href="http://news.php.net/php.internals/66229">souligné</a> Dmitry Stogov, cette modification peut avoir des impacts auxquels on ne pense pas immédiatement ; ce à quoi Stas Malyshev <a href="http://news.php.net/php.internals/66231">a fait remarquer</a> qu’il ne fallait pas sortir cette nouvelle fonctionnalité trop vite.</p> <p>La conversation s’est un peu essouflée en fin de mois, sans qu’aucune décision ne soit prise. Avec un peu de chance, on peut espérer qu’elle reprenne vie dans le futur, accompagnée d’une RFC.</p> <p><br></p> <p>Nikita Nefedov <a href="http://news.php.net/php.internals/65975">a fait remarquer</a> qu’il pourrait être intéressant de <strong>supprimer le mot-clef <code>function</code> lors de la déclaration de méthodes dans des classes, interfaces, et traits</strong> — après tout, ce mot-clef est quelque peu redondant et n’apporte pas de réelle information en soit.</p> <p>Comme l’a rapidement <a href="http://news.php.net/php.internals/65979">souligné</a> Johannes Schlüter, ce n’est pas la première fois que le sujet est abordé sur <code>internals@</code>, et, il y plus de deux ans de cela, l’idée avait été abandonnée, le mot-clef <code>function</code> étant pratique pour, par exemple, rechercher des définitions de méthodes à coups de <code>grep</code>.</p> <p>Dans l’ensemble, les retours semblent plutôt négatifs, entre <a href="http://news.php.net/php.internals/65984">les</a> <a href="http://news.php.net/php.internals/66001">greppeurs</a>, <a href="http://news.php.net/php.internals/65998">ceux</a> qui considèrent qu’il faudrait arrêter de vouloir changer la syntaxe de PHP “juste pour faire joli”, <a href="http://news.php.net/php.internals/66007">ceux</a> qui privilégient la lisibilité du code, et ceux qui soulignent que ce type de modification, même si sympathique, n’est pas réellement nécessaire<sup id="fnref:debat-ide"><a href="#fn:debat-ide">4</a></sup>.</p> <p>Finalement, considérant le peu d’intérêt pour cette idée et la forte opposition, la conversation s’est rapidement arrêtée, sans même atteindre l’étape “RFC”.</p> <p><br></p> <p>Keyur Govande <a href="http://news.php.net/php.internals/65703">a annoncé</a> avoir rédigé la <a href="https://wiki.php.net/rfc/cli_process_title">RFC: PHP CLI changing process title support</a>, l’idée étant d’introduire une manière permettant de <strong>renseigner le titre d’un processus PHP lancé en ligne de commande</strong> — titre qui peut être visible, par exemple, en sortie des commandes <code>ps</code> ou <code>top</code> ; ceci serait particulièrement utile dans le cas de processus durant longtemps : il deviendrait plus facile de les identifier et de les différencier.</p> <p>Même si l’utilité <a href="http://news.php.net/php.internals/65705">ne semblait pas</a> évidente <a href="http://news.php.net/php.internals/65714">à tous</a> au premier abord, plusieurs retours ont semblé montrer un <a href="http://news.php.net/php.internals/65725">certain</a> <a href="http://news.php.net/php.internals/65727">intérêt</a>, y compris parmis des utilisateurs de l’extension <a href="http://pecl.php.net/package/proctitle">proctitle</a> <em>(qui, notamment, ne fonctionne pas sous Windows, et souffre de quelques bugs génants)</em>.</p> <p>Après quelques échanges de mail, Keyur Govande a annoncé vouloir <a href="http://news.php.net/php.internals/65731">ouvrir la RFC au vote</a> ; considérant qu’une seule journée de discussion était <a href="http://news.php.net/php.internals/65732">relativement peu</a>, finalement, les votes <a href="http://news.php.net/php.internals/65734">n’ont pas</a> été ouverts de suite, et ne l’ont été que <a href="http://news.php.net/php.internals/66145">quelques jours après</a>.</p> <p>Les choses ont l’air plutôt bien parties ; et on peut espérer qu’à la fin de la période de votes, soit début mars, cette modification soit intégrée à PHP 5.5.</p> <p><br></p> <p>Ivan Enderlin <a href="http://news.php.net/php.internals/65821">a ouvert</a> un sujet de discussion où il faisait remarquer que PHP ne dispose pas d’un moyen unifié permettant à un script d’être tenu au courant de modifications apportées sur des fichiers — typiquement, pour effectuer une action dès qu’un fichier dans un ensemble de répertoires donné est modifié ; ce qui est parfois utile dans un contexte de scripts PHP durant longtemps et/ou en mode démon. Il suggère qu’une fonctionnalité de ce type, fonctionnant sous Windows/Mac/Linux, pourrait éventuellement avoir sa place dans le coeur de PHP.</p> <p>Julien Pauli <a href="http://news.php.net/php.internals/65824">a répondu</a> qu’une fonctionnalité de ce type n’aurait probablement pas sa place dans le core, mais que ceux qui en ressentaient le besoin avaient la possibilité d’utiliser une extension PECL <em>(il existe par exemple l’extension <a href="http://pecl.php.net/package/inotify">inotiy</a>, mais pour Linux uniquement)</em>. Il n’est d’ailleurs pas le seul à <a href="http://news.php.net/php.internals/65848">avoir répondu</a> en ce sens.</p> <p>D’après Patrick Allaert, une bonne approche <a href="http://news.php.net/php.internals/65841">serait</a> de développer ceci sous forme d’une bibliothèque C — elle même ensuite mise à disposition de PHP via encapsulation dans une extension PECL.</p> <p><br></p> <p>Sara Golemon <a href="http://news.php.net/php.internals/65931">a rédigé</a> la <a href="https://wiki.php.net/rfc/trailing-comma-function-args">RFC: Trailing comma function args</a>. L’idée proposée est d’<strong>autoriser la présence d’une virgule à la fin de la liste d’arguments lors d’un appel de fonction</strong> <em>(de manière à ce que <code>ma_fonction('plop', 'glop', );</code> soit syntaxiquement valide)</em>, de la même manière que c’est depuis toujours autorisé pour les déclarations de tableaux <em>(comme <code>$a = array('plop', 'glop', );</code> )</em>.</p> <p>Dans l’ensemble, l’idée <a href="http://news.php.net/php.internals/65932">a semblé</a> <a href="http://news.php.net/php.internals/65933">être</a> <a href="http://news.php.net/php.internals/65934">appréciée</a>, notamment parce qu’elle implémenterait une syntaxe cohérente avec celle permise pour les tableaux, sans changer le comportement existant <em>(si ce n’est autoriser une syntaxe qui ne l’était jusqu’à présent pas)</em>.</p> <p>Cela dit, les retours <a href="http://news.php.net/php.internals/66169">n’ont</a> <a href="http://news.php.net/php.internals/66164">pas</a> <a href="http://news.php.net/php.internals/66165">tous</a> été <a href="http://news.php.net/php.internals/66032">positifs</a> ; comme <a href="http://news.php.net/php.internals/66057">l’a remarqué</a> Alain Williams, autant il est fréquent d’ajouter un élément en fin de liste, autant il est plus rare d’effectuer ce type de modification sur un appel de fonction/méthode.</p> <p>Dans la foulée, Marcello Duarte <a href="http://news.php.net/php.internals/65937">a annoncé</a> avoir rédigé la <a href="https://wiki.php.net/rfc/short-syntax-for-anonymous-function">RFC: Short syntax for anonymous functions</a>. Dans l’ensemble, les retours semblent avoir été un peu plus négatifs sur celle-là, que ce soit parce que la syntaxe proposée <a href="http://news.php.net/php.internals/65952">ne plait</a> <a href="http://news.php.net/php.internals/65955">pas</a>, parce qu’elle introduit un <a href="http://news.php.net/php.internals/65944">risque de BC-break</a>, ou parce que l’idée en elle-même <a href="http://news.php.net/php.internals/65954">ne semble pas nécessaire</a> — sans compter le risque de <a href="http://news.php.net/php.internals/66044">nuire à la lisibilité</a> du code. Cela dit, même sans forcément apprécier la syntaxe, <a href="http://news.php.net/php.internals/65940">d’autres</a> ont visiblement apprécié la proposition, allant jusqu’à essayer de l’améliorer.</p> <p><br></p> <p>Paul Reinheimer a <a href="http://news.php.net/php.internals/66073">rédigé un mail</a> à propos d’un sujet qui est revenu dans plusieurs discussions ces derniers mois : <strong>la majorité des développeurs utilisant PHP</strong> ne va pas à des conférences, ne lit pas <code>internals@</code>, et <strong>est finalement assez <em>silencieuse</em></strong>. En conséquence, les développeurs de PHP peuvent parfois être quelque peu déconnectés de la réalité des utilisateurs du langage.</p> <p>Une possibilité pour en savoir plus sur les besoins des différents types de développeurs travaillant avec PHP pourrait être de mettre en place un sondage — qui devrait être suffisamment réfléchi et construit de manière suffisamment <em>scientifique</em> pour qu’il soit possible d’en tirer des enseignements utiles.</p> <p>Cela dit, Christopher Jones <a href="http://news.php.net/php.internals/66078">a fait remarquer</a> que les choses pourraient / devraient aussi aller dans le sens inverse : pour lui, il faudrait que plus de membres de la communauté deviennent développeurs de PHP, et non plus “seulement” utilisateurs. Malheureusement, comme l’a rapidement <a href="http://news.php.net/php.internals/66079">noté</a> Kris Craig, la plupart des développeurs utilisant PHP ne seraient pas forcément à l’aise avec du C.</p> <p>Pour essayer de faire avancer les choses, Florin Razvan Patan <a href="http://news.php.net/php.internals/66170">a commencé</a> à rédiger la <a href="https://wiki.php.net/rfc/site_voting_poll">RFC: Site voting poll</a>. A voir comment cela évoluera sur les prochaines semaines ?</p> <p><br></p> <p>Et pour finir avec un peu d’humour, Aaron Holmes <a href="http://news.php.net/php.internals/65793">a fait remarquer</a> que le <a href="http://xkcd.com/1172/">XKCD 1172</a><sup id="fnref:xkcd"><a href="#fn:xkcd">5</a></sup> faisait beaucoup penser à ce qu’il se passe parfois avec PHP :</p> <p><span style="display:block;text-align:center;"><a href="http://xkcd.com/1172/"><img alt-src="data:image/gif;base64,R0lGODdhAQABAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAAQABAAAIBAChBQQAOw==" alt="XKCD: Workflow" class="lazy" src="http://imgs.xkcd.com/comics/workflow.png"></a></span> <em><span style="display:block;text-align:center;"><strong>Crédits :</strong> <a href="http://xkcd.com/1172/">XKCD #1172</a></span></em></p> <p>En même temps, ce n’est pas loin de la vérité non plus…</p> <p><br></p> <hr> <p><strong><code>internals@lists.php.net</code></strong> est la <strong>mailing-list des développeurs de PHP</strong> ; elle est utilisée pour discuter des prochaines évolutions du langage, ainsi que pour échanger autour de suggestions d’améliorations ou de rapports de bugs. <br>Elle est publique, et tout le monde peut s’y inscrire depuis la page <a href="http://www.php.net/mailing-lists.php#internals">Mailing Lists</a>, ou consulter ses archives en HTTP depuis <a href="http://news.php.net/php.internals">php.internals</a> ou depuis le serveur de news <a href="news:/php.internals"><code>news://news.php.net/php.internals</code></a>.</p> <p><br></p> <div class="footnotes"> <hr> <ol> <li id="fn:perl"> <p>J’ai fait un peu de Perl dans mon “jeune temps” ; c’était fun comme langage… et il y avait moyen de s’amuser avec sa syntaxe ^^ Par contre, sur des projets de la taille de ceux sur lesquels j’ai bossé ces dernières années… je craindrais ^^ <a href="#fnref:perl">↩</a></p> </li> <li id="fn:php-pas-changement"> <p>Je simplifie peut-être un peu, au risque d’être caricatural — vous devinerez aisément de quel côté je me positionne ^^ <a href="#fnref:php-pas-changement">↩</a></p> </li> <li id="fn:eval-lambda"> <p>Bon, aussi, utiliser <code>eval()</code> pour créer des fonctions anonymes… <a href="#fnref:eval-lambda">↩</a></p> </li> <li id="fn:debat-ide"> <p>Forcément, en cours de route, la conversation a un peu déviée sur le nombre de développeurs qui utiliseraient <code>grep</code> pour rechercher des fonctions, ceux qui travaillent avec un IDE, ceux qui ne savent même pas ce qu’est <code>grep</code>, ou encore ceux qui considèrent que Linux est un IDE… <a href="#fnref:debat-ide">↩</a></p> </li> <li id="fn:xkcd"> <p>Oui, je fais parti de ceux qui apprécient XKCD et ont tendance à y faire référence ici et là ;-) <a href="#fnref:xkcd">↩</a></p> </li> </ol> </div> http://blog.pascal-martin.fr/post/php-mailing-list-internals-fevrier-2013#comment-new-form http://blog.pascal-martin.fr/post/php-mailing-list-internals-fevrier-2013#comment-new-form Aller plus loin avec un dump des opcodes d'un script PHP http://blog.pascal-martin.fr/post/aller-plus-loin-avec-dump-opcodes-script-php?utm_source=rss2&utm_medium=feed&utm_campaign=aller-plus-loin-avec-dump-opcodes-script-php http://blog.pascal-martin.fr/post/aller-plus-loin-avec-dump-opcodes-script-php Thu, 21 Feb 2013 07:00:00 +0100 Pascal MARTIN phpopcode <p> </p> <p>J’ai publié il y a quelques jours un article expliquant comment <a href="http://blog.pascal-martin.fr/post/php-obtenir-dump-opcodes">obtenir un dump des opcodes d’un script PHP</a>, en utilisant l’<a href="http://derickrethans.nl/projects.html#vld">extension VLD - Vulcan Logic Dumper</a>.</p> <p>Pour le compléter et aller un peu plus loin, je vais maintenant montrer comment obtenir un graphe des chemins correspondant à un dump d’opcodes — et donc, au code PHP initialement écrit.</p> <p>Et en seconde partie de cet article, je me baserai sur quelques dumps d’opcodes pour montrer que, des fois, mettre à jour PHP est une bonne idée ;-)</p> <p><br></p> <h1>Quelques options plus avancées de VLD : dump de chemins / branches</h1> <p>En plus de la <em>simple</em> fonctionnalité de dump d’opcodes, l’extension VLD<sup id="fnref:extension-vld"><a href="#fn:extension-vld">1</a></sup> propose quelques options supplémentaires :</p> <ul> <li>L’option <code>vld.dump_paths</code> permet d’activer un dump des chemins et branches d’exécution du code PHP, </li> <li>L’option <code>vld.save_paths</code> permet d’enregistrer ce dump supplémentaire vers le fichier <code>/tmp/paths.dot</code> <em>(format qui peut être utilisé avec <a href="http://www.graphviz.org/">graphviz</a>)</em>, </li> <li>Et enfin, l’option <code>vld.save_dir</code> permet de spécifier un autre répertoire vers lequel enregistrer ce fichier.</li> </ul> <p>A titre d’exemple, considérons la portion de code PHP suivante :</p> <pre><code class="language-php">&lt;?php $tmp = mt_rand(0, 2); if ($tmp === 0) { echo "zero"; } else if ($tmp === 1) { echo "un"; } else { echo "deux"; } echo "\n"; </code></pre> <p>Rien de bien particulier : un bloc <code>if</code> / <code>else if</code> / <code>else</code>, avec quelques sorties écran.</p> <p>Maintenant, utilisons VLD pour générer un dump des opcodes correspondant à ce script, ainsi que le dump des chemins correspondant — dump qui sera enregistré vers l’emplacement par défaut, <code>/tmp/paths.dot</code> :</p> <pre><code class="no-highlight">$ ~/bin/php-5.3/bin/php -dextension=vld.so -dvld.active=1 -dvld.verbosity=0 -dvld.execute=0 -dvld.dump_paths=1 -dvld.save_paths=1 exemples/005-dump-paths-1.php filename: /.../exemples/005-dump-paths-1.php function name: (null) number of ops: 15 compiled vars: !0 = $tmp line # * op fetch ext return operands --------------------------------------------------------------------------------- 2 0 &gt; SEND_VAL 0 1 SEND_VAL 2 2 DO_FCALL 2 $0 'mt_rand' 3 ASSIGN !0, $0 3 4 IS_IDENTICAL ~2 !0, 0 5 &gt; JMPZ ~2, -&gt;8 4 6 &gt; ECHO 'zero' 5 7 &gt; JMP -&gt;13 6 8 &gt; IS_IDENTICAL ~3 !0, 1 9 &gt; JMPZ ~3, -&gt;12 7 10 &gt; ECHO 'un' 8 11 &gt; JMP -&gt;13 10 12 &gt; ECHO 'deux' 12 13 &gt; ECHO '%0A' 13 14 &gt; RETURN 1 branch: # 0; line: 2- 3; sop: 0; eop: 5; out1: 6; out2: 8 branch: # 6; line: 4- 5; sop: 6; eop: 7; out1: 13 branch: # 8; line: 6- 6; sop: 8; eop: 9; out1: 10; out2: 12 branch: # 10; line: 7- 8; sop: 10; eop: 11; out1: 13 branch: # 12; line: 10- 12; sop: 12; eop: 12; out1: 13 branch: # 13; line: 12- 13; sop: 13; eop: 14 path #1: 0, 6, 13, path #2: 0, 8, 10, 13, path #3: 0, 8, 12, 13, </code></pre> <p>le fichier <code>/tmp/paths.dot</code> est bien généré en sortie :</p> <pre><code class="no-highlight">$ ll /tmp/paths.dot -rw-r--r-- 1 squale squale 711 janv. 3 15:25 /tmp/paths.dot </code></pre> <p>Et, pour les curieux, voici à quoi il ressemble :</p> <pre><code class="no-highlight">$ cat /tmp/paths.dot digraph { subgraph cluster_file_01471438 { label="file /.../exemples/005-dump-paths-1.php"; subgraph cluster_01471438 { label="__main"; graph [rankdir="LR"]; node [shape = record]; "__main_0" [ label = "{ op #0 | line 2-3 }" ]; __main_0 -&gt; __main_6; __main_0 -&gt; __main_8; "__main_6" [ label = "{ op #6 | line 4-5 }" ]; __main_6 -&gt; __main_13; "__main_8" [ label = "{ op #8 | line 6-6 }" ]; __main_8 -&gt; __main_10; __main_8 -&gt; __main_12; "__main_10" [ label = "{ op #10 | line 7-8 }" ]; __main_10 -&gt; __main_13; "__main_12" [ label = "{ op #12 | line 10-12 }" ]; __main_12 -&gt; __main_13; "__main_13" [ label = "{ op #13 | line 12-13 }" ]; } } } </code></pre> <p>A partir du fichier <code>.dot</code> généré par VLD, il est possible de générer un <code>.png</code>, en utilisant l’outil <code>dot</code> de graphviz :</p> <pre><code class="language-bash">dot -Tpng /tmp/paths.dot &gt; /tmp/paths.png </code></pre> <p>Ce qui nous donne en sortie une image de ce type <em>(j’ai supprimé le nom du fichier qui figurait normalement en haut de l’image, pour réduire un peu ses dimensions)</em> :</p> <p><span style="display:block;text-align:center;"><img alt-src="data:image/gif;base64,R0lGODdhAQABAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAAQABAAAIBAChBQQAOw==" alt="Chemins correspondant à l'exemple if/else if/else" class="lazy" src="http://blog.pascal-martin.fr/public/php-opcodes/php-vld-paths-005-dump-paths-1.png" width="279px" height="478px"></span></p> <p>On retrouve, à partir des opcodes, la structure de notre script — et ce graphe de chemins peut faciliter la compréhension du dump d’opcodes brutes, en particulier dans des cas de scripts / fonctions plus longs que l’exemple que j’ai pris ici.</p> <p><br> D’ailleurs, en générant le graphe de chemins pour l’exemple utlisé à la <a href="http://blog.pascal-martin.fr/post/php-obtenir-dump-opcodes#structures-conditionnelles-boucles">section “Un peu de structures conditionnelles / boucles” de mon précédent article</a>, voici ce que l’on obtient :</p> <p><span style="display:block;text-align:center;"><img alt-src="data:image/gif;base64,R0lGODdhAQABAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAAQABAAAIBAChBQQAOw==" alt="Chemins correspondant à l'exemple for/if/else" class="lazy" src="http://blog.pascal-martin.fr/public/php-opcodes/php-vld-paths-control-for-if-else.png" width="283px" height="730px"></span></p> <p>Utiliser ceci en parallèle des explications textuelles données un peu plus haut devrait vous aider à y voir plus clair ;-)</p> <h1>Opcodes : des différences entre les versions de PHP ?</h1> <p>Chaque nouvelle version de PHP vient avec son lot de modifications, d’améliorations, et d’optimisations.</p> <p>Certaines d’entre elles peuvent parfois porter sur le processus de compilation de code PHP en opcodes — l’idée générale, un peu simplifiée certes, étant que moins il y a d’opcodes à exécuter, plus cette exécution devrait être rapide.</p> <p>Bien entendu, il ne faut pas s’attendre à ce que les opcodes générées pour une portion de script PHP changent du tout au tout entre deux versions de PHP… Mais, voici quelques exemples courts, sur lesquels on constate de petites différences.</p> <h2>Premier exemple</h2> <p>Tout d’abord, prenons la portion de code suivante :</p> <pre><code class="language-php">&lt;?php $who = 'World'; $str = "Hello, $who!"; echo $str; </code></pre> <p>En quelques mots : on utilise l’interpolation de variables pour combiner deux chaines de caractères, et on affiche la chaîne résultante — oui, encore un <em>Hello, World</em>.</p> <p>Avec <strong>PHP 5.3 et PHP 5.4</strong>, la sortie obtenue en utilisant VLD est la suivante :</p> <pre><code class="no-highlight">$ ~/bin/php-5.4/bin/php -dextension=vld.so -dvld.active=1 -dvld.verbosity=0 -dvld.execute=0 exemples/010-diff-versions-php-1.php filename: /.../exemples/010-diff-versions-php-1.php function name: (null) number of ops: 7 compiled vars: !0 = $who, !1 = $str line # * op fetch ext return operands --------------------------------------------------------------------------------- 2 0 &gt; ASSIGN !0, 'World' 3 1 ADD_STRING ~1 'Hello%2C+' 2 ADD_VAR ~1 ~1, !0 3 ADD_CHAR ~1 ~1, 33 4 ASSIGN !1, ~1 4 5 ECHO !1 5 6 &gt; RETURN 1 branch: # 0; line: 2- 5; sop: 0; eop: 6 path #1: 0, </code></pre> <p>Par contre, avec <strong>PHP 5.2.17</strong>, la sortie est la suivante :</p> <pre><code class="no-highlight">$ ~/bin/php-5.2/bin/php -dextension=vld.so -dvld.active=1 -dvld.verbosity=0 -dvld.execute=0 exemples/010-diff-versions-php-1.php filename: /.../exemples/010-diff-versions-php-1.php function name: (null) number of ops: 9 compiled vars: !0 = $who, !1 = $str line # * op fetch ext return operands --------------------------------------------------------------------------------- 2 0 &gt; ASSIGN !0, 'World' 3 1 INIT_STRING ~1 2 ADD_STRING ~1 ~1, 'Hello%2C+' 3 ADD_VAR ~1 ~1, !0 4 ADD_CHAR ~1 ~1, 33 5 ASSIGN !1, ~1 4 6 ECHO !1 5 7 &gt; RETURN 1 8* &gt; ZEND_HANDLE_EXCEPTION branch: # 0; line: 2- 5; sop: 0; eop: 8 path #1: 0, </code></pre> <p>La compilation de nos trois lignes de code PHP mène à 2 opcodes de plus avec PHP 5.2 qu’avec PHP 5.3 :</p> <ul> <li>Un opcode <code>INIT_STRING</code>, en seconde instruction, </li> <li>et un opcode <code>ZEND_HANDLE_EXCEPTION</code> en toute dernière ligne — opcode qui ne sera jamais exécuté, d’ailleurs <em>(VLD l’a marqué d’une <code>*</code>)</em> : il est positionné après un <code>RETURN</code>.</li> </ul> <p>En remontant un peu plus loin dans l’histoire, avec <strong>PHP 5.1.6</strong>, nous aurions obtenu encore plus d’opcodes :</p> <pre><code class="no-highlight">$ ~/bin/php-5.1/bin/php -dextension=vld.so -dvld.active=1 -dvld.verbosity=0 -dvld.execute=0 exemples/010-diff-versions-php-1.php filename: /.../exemples/010-diff-versions-php-1.php function name: (null) number of ops: 10 compiled vars: !0 = $who, !1 = $str line # * op fetch ext return operands --------------------------------------------------------------------------------- 2 0 &gt; ASSIGN !0, 'World' 3 1 INIT_STRING ~1 2 ADD_STRING ~1 ~1, 'Hello' 3 ADD_STRING ~1 ~1, '%2C+' 4 ADD_VAR ~1 ~1, !0 5 ADD_STRING ~1 ~1, '%21' 6 ASSIGN !1, ~1 4 7 ECHO !1 5 8 &gt; RETURN 1 9* &gt; ZEND_HANDLE_EXCEPTION branch: # 0; line: 2- 5; sop: 0; eop: 9 path #1: 0, </code></pre> <p>Ce n’est pas vraiment mis en évidence ici, puisque la chaine de caractères utilisant de l’interpolation de variables n’est pas très longue, mais PHP 5.1 générait un opcode <code>ADD_STRING</code> pour chaque ensemble de caractères séparés par un espace ! <br>Vous pourriez faire le test avec une chaine comme <code>"Voici une $var plus longue."</code>, qui nécessite <strong>11 opcodes en PHP 5.1</strong> — et <strong>seulement 3 en PHP 5.4</strong>.</p> <p><br> Que tirer de ceci ?</p> <ul> <li>Avec PHP 5.1, utiliser des chaines de caractères entourées de double-quotes, avec de l’interpolation de variables, n’était vraiment pas fantastique au niveau du nombre d’opcodes générés — c’est probablement un peu de là que vient la <em>(il fût un temps micro-optimisation / )</em> généralisation un peu sauvage en <em>“utilisez des chaines de caractères entre simple-quotes”</em>.</li> <li>Mais PHP 5.2 a déjà grandement amélioré les choses, rendant quasiment obsolète cette affirmation — du moins sur des cas tels que celui présenté ici.</li> <li>Et PHP 5.3 a encore amélioré ce cas.</li> </ul> <p>Autrement dit, <strong>la meilleure “optimisation” que vous puissiez faire</strong> — <em>et qui n’est même pas de la “micro”-optimisation vu les benchs</em> — <strong>est d’utiliser une version à jour de PHP !</strong></p> <h2>Second exemple</h2> <p>Comme second exemple, considérons la portion de code suivante, qui définit une fonction, et l’appelle en affichant sa valeur de retour :</p> <pre><code class="language-php">&lt;?php function add($val1, $val2) { return $val1 + $val2; } echo test(10, 5); </code></pre> <p>Avec PHP 5.4, la sortie obtenue avec VLD est la suivante :</p> <pre><code class="no-highlight">$ ~/bin/php-5.4/bin/php -dextension=vld.so -dvld.active=1 -dvld.verbosity=0 -dvld.execute=0 exemples/010-diff-versions-php-2.php filename: /.../exemples/010-diff-versions-php-2.php function name: (null) number of ops: 7 compiled vars: none line # * op fetch ext return operands --------------------------------------------------------------------------------- 2 0 &gt; NOP 7 1 INIT_FCALL_BY_NAME 'test' 2 SEND_VAL 10 3 SEND_VAL 5 4 DO_FCALL_BY_NAME 2 $0 5 ECHO $0 8 6 &gt; RETURN 1 branch: # 0; line: 2- 8; sop: 0; eop: 6 path #1: 0, Function add: filename: /.../exemples/010-diff-versions-php-2.php function name: add number of ops: 5 compiled vars: !0 = $val1, !1 = $val2 line # * op fetch ext return operands --------------------------------------------------------------------------------- 2 0 &gt; RECV !0 1 RECV !1 4 2 ADD ~0 !0, !1 3 &gt; RETURN ~0 5 4* &gt; RETURN null branch: # 0; line: 2- 5; sop: 0; eop: 4 path #1: 0, End of function add. </code></pre> <p>En premier, nous avons la définition de la fonction ; et ensuite, son appel.</p> <p>Avec PHP 5.2, nous aurions la sortie suivante :</p> <pre><code class="no-highlight">$ ~/bin/php-5.2/bin/php -dextension=vld.so -dvld.active=1 -dvld.verbosity=0 -dvld.execute=0 exemples/010-diff-versions-php-2.php filename: /.../exemples/010-diff-versions-php-2.php function name: (null) number of ops: 8 compiled vars: none line # * op fetch ext return operands --------------------------------------------------------------------------------- 2 0 &gt; NOP 7 1 INIT_FCALL_BY_NAME 'test' 2 SEND_VAL 10 3 SEND_VAL 5 4 DO_FCALL_BY_NAME 2 $0 5 ECHO $0 8 6 &gt; RETURN 1 7* &gt; ZEND_HANDLE_EXCEPTION branch: # 0; line: 2- 8; sop: 0; eop: 7 path #1: 0, Function add: filename: /.../exemples/010-diff-versions-php-2.php function name: add number of ops: 6 compiled vars: !0 = $val1, !1 = $val2 line # * op fetch ext return operands --------------------------------------------------------------------------------- 2 0 &gt; RECV 1 1 RECV 2 4 2 ADD ~0 !0, !1 3 &gt; RETURN ~0 5 4* RETURN null 5* &gt; ZEND_HANDLE_EXCEPTION branch: # 0; line: 2- 5; sop: 0; eop: 5 path #1: 0, End of function add. </code></pre> <p>En somme, cette fois-ci, peu de différence : on notera juste la présence d’une opcode <code>ZEND_HANDLE_EXCEPTION</code> inutile à la fin de chacun des deux extraits, avec PHP 5.2.</p> <p><br></p> <p>Arrivés à la fin de ce second article sur les opcodes de PHP, <strong>j’espère avoir réussi à attirer votre curiosité</strong> : c’était le but<sup id="fnref:opcode-curiosite"><a href="#fn:opcode-curiosite">2</a></sup> ^^</p> <p>Je n’ai pas du tout parlé de la phase d’exécution de ces opcodes, qui correspond réellement à l’exécution d’un script PHP <em>(la génération des opcodes correspondant à la compilation du PHP)</em> ; si vous êtes joueur et avez envie d’en apprendre plus, je vous encourage à ouvrir le fichier <a href="http://lxr.php.net/xref/PHP_5_4/Zend/zend_vm_def.h"><code>Zend/zend_vm_def.h</code></a>, qui fait parti des sources de PHP : vous y trouverez la définition de chaque opcode géré par le moteur d’exécution de PHP.</p> <p><br></p> <div class="footnotes"> <hr> <ol> <li id="fn:extension-vld"> <p>Je ne reviens par dans cet article sur l’installation de l’extension VLD, ni son fonctionnement de base ; en cas de besoin, je vous encourage à lire l’article <a href="http://blog.pascal-martin.fr/post/php-obtenir-dump-opcodes">Obtenir un dump des opcodes d’un script PHP</a> que j’ai publié il y a quelques jours. <a href="#fnref:extension-vld">↩</a></p> </li> <li id="fn:opcode-curiosite"> <p>Autant le sujet des opcodes peut attirer notre curiosité, du point de vue d’un développeur purement “PHP”, il est somme toute plus que rare que nous ayons à nous en soucier… <a href="#fnref:opcode-curiosite">↩</a></p> </li> </ol> </div> http://blog.pascal-martin.fr/post/aller-plus-loin-avec-dump-opcodes-script-php#comment-new-form http://blog.pascal-martin.fr/post/aller-plus-loin-avec-dump-opcodes-script-php#comment-new-form Obtenir un dump des opcodes d'un script PHP http://blog.pascal-martin.fr/post/php-obtenir-dump-opcodes?utm_source=rss2&utm_medium=feed&utm_campaign=php-obtenir-dump-opcodes http://blog.pascal-martin.fr/post/php-obtenir-dump-opcodes Mon, 18 Feb 2013 07:00:00 +0100 Pascal MARTIN phpopcode <p> </p> <p>Lors de l’exécution d’un script PHP, l’interpréteur PHP passe par deux étapes :</p> <ul> <li>Tout d’abord, le script écrit en langage PHP est <strong>compilé en opcodes</strong>, </li> <li>Puis <strong>ces opcodes sont exécutés</strong>.</li> </ul> <p>Basiquement, les opcodes sont des instructions simples ; nettement plus, en tout cas, que le langage PHP que nous écrivons.</p> <p>Dans notre vie de tous les jours, savoir que ce processus <code>PHP -&gt; opcodes -&gt; exécution</code> existe est utile : il nous permet par exemple de comprendre l’utilité d’un cache d’opcodes comme <a href="http://pecl.php.net/package/APC">APC</a>. Mais, heureusement, il est rare que nous ayons à nous pencher sur les opcodes en eux-même.</p> <p>Cela dit, pour les plus curieux d’entre nous<sup id="fnref:nostalgie-assembleur"><a href="#fn:nostalgie-assembleur">1</a></sup>, il existe des extensions PHP permettant d’obtenir la <strong>liste des opcodes correspondant à un script PHP</strong>.</p> <h1>Installation de VLD</h1> <p>L’extension <a href="http://derickrethans.nl/projects.html#vld">VLD - Vulcan Logic Dumper</a> est généralement celle à laquelle je pense à premier, lorsque je veux obtenir un dump des opcodes correspondant à un script PHP.</p> <p>Il s’agit d’une extension PECL, qui s’installe comme n’importe quelle autre extension du genre, via la commande <code>pecl install</code> :</p> <pre><code class="no-highlight">~/bin/php-5.3/bin/pecl install vld downloading vld-0.11.2.tgz ... Starting to download vld-0.11.2.tgz (16,403 bytes) </code></pre> <p>Cette extension étant en bêta<sup id="fnref:vld-beta"><a href="#fn:vld-beta">2</a></sup>, si vous n’avez sélectionné le channel par défaut, vous aurez peut-être à utiliser :</p> <pre><code class="no-highlight">~/bin/php-5.3/bin/pecl install vld-beta downloading vld-0.11.2.tgz ... Starting to download vld-0.11.2.tgz (16,403 bytes) </code></pre> <p>Et pour vérifier que l’extension se charge, elle doit apparaitre en sortir d’un <code>php -m</code>, à partir du moment où <code>extension=vld.so</code> est spécifié comme option :</p> <pre><code class="no-highlight">$ ~/bin/php-5.3/bin/php -dextension=vld.so -m [PHP Modules] bcmath bz2 calendar ... tokenizer vld xml ... </code></pre> <p>L’autre solution serait d’ajouter <code>extension=vld.so</code> à votre fichier <code>php.ini</code> ou à un des fichiers interprétés par PHP — mais je n’ai pas tendance à le faire pour cette extension, puisque je ne souhaite la charger que très rarement, et pas “par défaut”.</p> <h1>Obtenir un premier dump d’opcodes</h1> <p>Une fois l’extension VLD installée, il va nous être possible d’<strong>obtenir un dump d’opcodes pour un script PHP</strong>.</p> <p>Par exemple, considérons le script PHP suivant — qui est des plus simples, vous l’admettrez :</p> <pre><code class="language-php">&lt;?php echo "Hello, World"; </code></pre> <p>Pour obtenir la liste des opcodes correspondant à ce script, PHP doit être invoqué en ligne de commandes, en chargeant l’extension VLD <em>(<code>-dextension=vld.so</code>)</em>, et en lui spécifiant qu’elle doit être active <em>(<code>-dvld.active=1</code>)</em> :</p> <pre><code class="no-highlight">$ ~/bin/php-5.3/bin/php -dextension=vld.so -dvld.active=1 exemples/001-hello-world.php Finding entry points Branch analysis from position: 0 Return found filename: /.../exemples/001-hello-world.php function name: (null) number of ops: 2 compiled vars: none line # * op fetch ext return operands --------------------------------------------------------------------------------- 2 0 &gt; ECHO 'Hello%2C+World' 3 1 &gt; RETURN 1 branch: # 0; line: 2- 3; sop: 0; eop: 1 path #1: 0, Hello, World </code></pre> <p>Il est possible de jouer avec la verbosité pour obtenir une sortie plus ou moins riche, en utilisant l’option <code>vld.verbosity</code>, qui vaut <code>1</code> par défaut. Il est possible de la baisser à <code>0</code>, ou l’augmenter — une valeur de <code>3</code>, par exemple, ajoute des informations portant sur les types de données manipulées.</p> <p>L’option <code>vld.execute</code> est dans certains cas intéressante, puisqu’elle permet d’éviter l’exécution du code PHP — afin de n’obtenir en sortie que les opcodes, et pas les affichages provoqués par le script.</p> <p>En jouant avec les options <code>vld.verbosity</code> et <code>vld.execute</code>, voici un exemple de sortie que nous pourrions obtenir :</p> <pre><code class="no-highlight">$ ~/bin/php-5.3/bin/php -dextension=vld.so -dvld.active=1 -dvld.verbosity=0 -dvld.execute=0 exemples/001-hello-world.php filename: /.../exemples/001-hello-world.php function name: (null) number of ops: 2 compiled vars: none line # * op fetch ext return operands --------------------------------------------------------------------------------- 2 0 &gt; ECHO 'Hello%2C+World' 3 1 &gt; RETURN 1 branch: # 0; line: 2- 3; sop: 0; eop: 1 path #1: 0, </code></pre> <p>Nous n’avons pas, cette fois-ci, obtenu l’affichage du <code>"Hello, World"</code> ; et moins d’informations sont affichées autour de la liste des opcodes.</p> <h1>Des exemples avec des scripts PHP plus longs ?</h1> <p>Nous avons vu juste au-dessus que l’extension VLD nous permettait d’obtenir un dump des opcodes correspondant à un script PHP.</p> <p>Cela dit, un <em>“Hello, World”</em> n’est pas forcément l’exemple le plus intéressant… Passons donc à quelque chose d’un peu plus complet !</p> <h2>Avec une déclaration et un appel de fonction</h2> <p>Tout d’abord, prenons un exemple où nous déclarons une fonction, et l’appelons en lui passant un paramètre — pour ensuite afficher la valeur retournée :</p> <pre><code class="language-php">&lt;?php function hello($who) { return sprintf("Hello, %s!", $who); } echo hello('World'); </code></pre> <p>La sortie renvoyée par VLD pour ce script est la suivante :</p> <pre><code class="no-highlight">$ ~/bin/php-5.3/bin/php -dextension=vld.so -dvld.active=1 -dvld.verbosity=0 -dvld.execute=0 exemples/003-function.php filename: /.../exemples/003-function.php function name: (null) number of ops: 5 compiled vars: none line # * op fetch ext return operands --------------------------------------------------------------------------------- 2 0 &gt; NOP 6 1 SEND_VAL 'World' 2 DO_FCALL 1 $0 'hello' 3 ECHO $0 7 4 &gt; RETURN 1 branch: # 0; line: 2- 7; sop: 0; eop: 4 path #1: 0, Function hello: filename: /.../exemples/003-function.php function name: hello number of ops: 6 compiled vars: !0 = $who line # * op fetch ext return operands --------------------------------------------------------------------------------- 2 0 &gt; RECV 1 3 1 SEND_VAL 'Hello%2C+%25s%21' 2 SEND_VAR !0 3 DO_FCALL 2 $0 'sprintf' 4 &gt; RETURN $0 4 5* &gt; RETURN null branch: # 0; line: 2- 4; sop: 0; eop: 5 path #1: 0, End of function hello. </code></pre> <p>Cette sortie se découpe en deux portions :</p> <ul> <li>L’appel de notre fonction, </li> <li>Et ensuite, sa déclaration.</li> </ul> <p>En essayant de formuler en français ce que la portion correspondant à l’appel de la fonction fait, nous aurions :</p> <ul> <li>Tout d’abord, la valeur <code>'Hello'</code> est envoyée, </li> <li>Puis, la fonction <code>'hello'</code> est appelée ; sa valeur de retour étant stockée dans <code>$0</code>, </li> <li>Cette valeur <code>$0</code> est alors affichée, </li> <li>Et enfin, le script se termine avec un retour à <code>1</code>.</li> </ul> <p>Et pour la déclaration de la fonction <code>hello()</code>, maintenant :</p> <ul> <li>Tout d’abord, notre fonction reçoit un paramètre,</li> <li>Puis elle empile la chaine <code>"Hello, %s!"</code> — celle que nous passons en premier paramètre à <code>sprintf()</code>, </li> <li>Après quoi elle empile le second paramètre passé à la fonction <code>sprintf()</code> — qui est le premier paramètre reçu en argument par notre fonction : <code>!0</code> que nous avions nommé <code>$who</code> dans le code PHP <em>(Cette correspondance entre <code>!0</code> et <code>$who</code> est indiquée au-dessus de la liste d’opcodes de la fonction, dans la section <code>compiled vars</code>)</em>, </li> <li>Pour ensuite appeler fonction <code>sprintf()</code>, en stockant sa valeur de retour dans <code>$0</code>, </li> <li>Et cette valeur de retour de <code>sprintf()</code>, <code>$0</code>, sera elle-même retournée par notre fonction.</li> <li>On notera que la liste d’opcodes de cette fonction se termine par deux opcodes <code>RETURN</code> ; le second, qui aurait retourné <code>null</code>, ne sera jamais exécuté (puisqu’il est précédé du <code>RETURN $0</code>), et est donc marqué d’une <code>*</code> par VLD.</li> </ul> <h2>Et une classe, alors ?</h2> <p>Une question, qu’on aura parfois tendance à se poser après avoir vu l’exemple précédent, tourne autour des classes : <em>“mais comment est-ce que ça marche pour une classe et des méthodes ?”</em>. Je serais tenté de répondre que la meilleure façon de savoir est d’essayer ; avec une portion de code telle que celle que je reproduis ci-dessous :</p> <pre><code class="language-php">&lt;?php class MaClasse { protected $prop; public function __construct($valeur) { $this-&gt;prop = $valeur; } public function add($valeur) { $this-&gt;prop += $valeur; } public function getValeur() { return $this-&gt;prop; } } $obj = new MaClasse(32); $obj-&gt;add(10); $result = $obj-&gt;getValeur(); echo $result; </code></pre> <p>La sortie obtenue via l’extension VLD est relativement longue ; et je ne vais pas la reproduire d’un seul trait ; voici ce que nous obtenons pour le script — pour le code en dehors de la classe, les quelques lignes en bas de l’exemple de code PHP reproduit ci-dessus :</p> <pre><code class="no-highlight">$ ~/bin/php-5.3/bin/php -dextension=vld.so -dvld.active=1 -dvld.verbosity=0 -dvld.execute=0 exemples/003-classe.php filename: /.../exemples/003-classe.php function name: (null) number of ops: 14 compiled vars: !0 = $obj, !1 = $result line # * op fetch ext return operands --------------------------------------------------------------------------------- 2 0 &gt; NOP 15 1 ZEND_FETCH_CLASS 4 :1 'MaClasse' 2 NEW $2 :1 3 SEND_VAL 32 4 DO_FCALL_BY_NAME 1 5 ASSIGN !0, $2 16 6 ZEND_INIT_METHOD_CALL !0, 'add' 7 SEND_VAL 10 8 DO_FCALL_BY_NAME 1 17 9 ZEND_INIT_METHOD_CALL !0, 'getValeur' 10 DO_FCALL_BY_NAME 0 $8 11 ASSIGN !1, $8 18 12 ECHO !1 19 13 &gt; RETURN 1 </code></pre> <p>Je vous laisse parcourir ces 14 opcodes pour essayer de les comprendre ; dans les grandes lignes, une classe est chargée via <a href="http://php.net/manual/fr/internals2.opcodes.fetch-class.php"><code>ZEND_FETCH_CLASS</code></a>, puis instanciée à l’aide de <a href="http://php.net/manual/fr/internals2.opcodes.new.php"><code>NEW</code></a>, après quoi son constructeur est appelé <em>(instruction 4, avec <a href="http://php.net/manual/fr/internals2.opcodes.do-fcall-by-name.php"><code>DO_FCALL_BY_NAME</code></a>)</em>. Les méthodes <code>add()</code> et <code>getValeur()</code> sont ensuite invoquées, en stockant la valeur de retour de la seconde dans <code>$result</code>, qui finit par être affichée.</p> <p>Viennent ensuite les listes d’opcodes de chacune des méthodes de la classe, qui constituent autant de sous-ensembles que l’on pourrait considérer comme indépendant. <br>Commençons par le constructeur :</p> <pre><code class="no-highlight">Class MaClasse: Function __construct: filename: /.../exemples/003-classe.php function name: __construct number of ops: 4 compiled vars: !0 = $valeur line # * op fetch ext return operands --------------------------------------------------------------------------------- 4 0 &gt; RECV 1 5 1 ZEND_ASSIGN_OBJ 'prop' 2 ZEND_OP_DATA !0 6 3 &gt; RETURN null branch: # 0; line: 4- 6; sop: 0; eop: 3 path #1: 0, End of function __construct. </code></pre> <p><em>Simplement</em>, la valeur reçue en paramètre, via la variable <code>$valeur</code> ici désignée par <code>!0</code>, est assignée à la propriété <code>prop</code>.</p> <p>Suit la définition de la méthode <code>add()</code>, qui ajoute à <code>prop</code> la valeur reçue via le paramètre <code>$valeur</code>, ici aussi désigné par <code>!0</code> :</p> <pre><code class="no-highlight">Function add: filename: /.../exemples/003-classe.php function name: add number of ops: 4 compiled vars: !0 = $valeur line # * op fetch ext return operands --------------------------------------------------------------------------------- 7 0 &gt; RECV 1 8 1 ASSIGN_ADD 88 'prop' 2 ZEND_OP_DATA !0 9 3 &gt; RETURN null branch: # 0; line: 7- 9; sop: 0; eop: 3 path #1: 0, End of function add. </code></pre> <p>Et, finalement, la dernière méthode de notre classe, <code>getValeur()</code>, qui charge la valeur de la propriété <code>prop</code> et la retourne à l’appelant :</p> <pre><code class="no-highlight">Function getvaleur: filename: /.../exemples/003-classe.php function name: getValeur number of ops: 3 compiled vars: none line # * op fetch ext return operands --------------------------------------------------------------------------------- 11 0 &gt; FETCH_OBJ_R $0 'prop' 1 &gt; RETURN $0 12 2* &gt; RETURN null branch: # 0; line: 11- 12; sop: 0; eop: 2 path #1: 0, End of function getvaleur. End of class MaClasse. </code></pre> <p>Pour une quinzaine de lignes de code PHP, ça représente un bon paquet de lignes en sortant de VLD, n’est-ce pas ? Mais, malgrés tout, à condition de ne pas prendre peur devant tous ces opcodes, cette sortie reste globalement compréhensible, non ?</p> <h2 id="structures-conditionnelles-boucles">Un peu de structures conditionnelles / boucles</h2> <p>Pour illustrer le type d’enchainements d’opcodes correspondant à des boucles et conditions, prenons l’exemple de la portion de code suivante <em>(qui pourrait être écrite de façon un peu plus concise, j’en conviens)</em> :</p> <pre><code class="language-php">&lt;?php for ($i=0 ; $i&lt;10 ; $i++) { if ($i % 2 === 0) { echo "Pair : "; } else { echo "Impair : "; } echo $i, "\n"; } </code></pre> <p>Avec un niveau de verbosité à <code>0</code>, la sortie obtenue avec VLD est la suivante :</p> <pre><code class="no-highlight">$ ~/bin/php-5.3/bin/php -dextension=vld.so -dvld.active=1 -dvld.verbosity=0 -dvld.execute=0 exemples/003-control.php filename: /.../exemples/003-control.php function name: (null) number of ops: 16 compiled vars: !0 = $i line # * op fetch ext return operands --------------------------------------------------------------------------------- 2 0 &gt; ASSIGN !0, 0 1 &gt; IS_SMALLER ~1 !0, 10 2 &gt; JMPZNZ 6 ~1, -&gt;15 3 &gt; POST_INC ~2 !0 4 FREE ~2 5 &gt; JMP -&gt;1 3 6 &gt; MOD ~3 !0, 2 7 IS_IDENTICAL ~4 ~3, 0 8 &gt; JMPZ ~4, -&gt;11 4 9 &gt; ECHO 'Pair+%3A+' 5 10 &gt; JMP -&gt;12 7 11 &gt; ECHO 'Impair+%3A+' 9 12 &gt; ECHO !0 13 ECHO '%0A' 10 14 &gt; JMP -&gt;3 11 15 &gt; &gt; RETURN 1 branch: # 0; line: 2- 2; sop: 0; eop: 0; out1: 1 branch: # 1; line: 2- 2; sop: 1; eop: 2; out1: 15; out2: 6 branch: # 3; line: 2- 2; sop: 3; eop: 5; out1: 1 branch: # 6; line: 3- 3; sop: 6; eop: 8; out1: 9; out2: 11 branch: # 9; line: 4- 5; sop: 9; eop: 10; out1: 12 branch: # 11; line: 7- 9; sop: 11; eop: 11; out1: 12 branch: # 12; line: 9- 10; sop: 12; eop: 14; out1: 3 branch: # 15; line: 11- 11; sop: 15; eop: 15 path #1: 0, 1, 15, path #2: 0, 1, 6, 9, 12, 3, 1, 15, path #3: 0, 1, 6, 11, 12, 3, 1, 15, </code></pre> <p>Cela peut sembler être un peu cryptique si on regarde de loin, avec des sauts dans tous les sens<sup id="fnref:nostalgie-assembleur-2"><a href="#fn:nostalgie-assembleur-2">3</a></sup>, mais, finalement, c’est “juste” la transcription de la portion de code que nous avons écrite — celle-ci pourrait être lu de la manière suivante :</p> <ul> <li> <strong>Instruction 0 :</strong> On assigne <code>0</code> à la variable <code>$i</code> ; qui est représentée par <code>!0</code>, comme indiqué dans la section <code>compiled vars</code>.</li> <li> <strong>Instruction 1 :</strong> “Est-ce que <code>$i</code> est inférieur à <code>10</code>” est stocké dans <code>~1</code>.</li> <li> <strong>Instruction 2 :</strong> <ul> <li>Si <code>~1</code> est faux, on saute vers l’<strong>instruction 15</strong> <em>(cf seconde colonne, celle titrée “#”)</em>, marquant ainsi la fin de la boucle.</li> <li>Sinon, on saute vers l’<strong>instruction 6</strong> <em>(on entre dans le corps de la boucle <code>for</code>, autrement dit — en passant après les opcodes 3 à 5 qui correspondent à l’operation du <code>for</code>, et au retour au début, au test de la condition)</em>.</li> </ul> </li> <li> <strong>Instruction 3 :</strong> on post-incrémente <code>$i</code>, et on stocke le résultat de cette post-incrémentation dans <code>~2</code> ; c’est l’opération effectuée en troisième partie de la boucle <code>for</code>.</li> <li> <strong>Instruction 4 :</strong> on libère <code>~2</code>, qui correspond au résultat de la post-incrémentation de <code>$i</code> ; dans la pratique, stocker ce résultat lors de l’<strong>instruction 3</strong> a été complètement inutile, puisque nous le libérons immédiatement après.</li> <li> <strong>Instruction 5 :</strong> on saute vers l’<strong>instruction 1</strong> ; en somme, après avoir incrémenté <code>$i</code>, nous revenons au test de la condition ; nous bouclons.</li> <li> <strong>Instruction 6 :</strong> on calcule le modulo 2 de <code>$i</code>, et stocke le résultat dans <code>~3</code> ; nous sommes à l’intérieur du corps de la structure <code>for</code>.</li> <li> <strong>Instruction 7 :</strong> on teste si <code>~3</code>, le résultat de ce modulo, est identique <em>(égalité stricte avec l’opérateur <code>===</code>)</em> à <code>0</code>, et stocke le résultat de la comparaison dans <code>~4</code>.</li> <li> <strong>Instruction 8 :</strong> si <code>~4</code> est faux <em>(le résultat du modulo n’est pas égal à <code>0</code> ; <code>$i</code> est donc un nombre impair)</em>, on saute vers l’<strong>instruction 11</strong>.</li> <li> <strong>Instruction 9 :</strong> on affiche <code>"Pair : "</code> ; on est dans le corps du <code>if</code>.</li> <li> <strong>Instruction 10 :</strong> on saute vers l’<strong>instruction 12</strong> ; nous sommes arrivés à la fin du corps du <code>if</code>, et sautons après le corps du <code>else</code>, pour ne pas l’exécuter.</li> <li> <strong>Instruction 11 :</strong> on affiche <code>"Impair : "</code> ; on est dans le corps du <code>else</code>.</li> <li> <strong>Instruction 12 :</strong> on affiche la valeur de <code>$i</code> ; on est après l’intégralité de la construction <code>if</code>/<code>else</code>.</li> <li> <strong>Instruction 13 :</strong> on affiche un retour à la ligne.</li> <li> <strong>Instruction 14 :</strong> on saute vers l’<strong>instruction 3</strong> ; vers l’opération de post-incrémentation de <code>$i</code>, effectuée en troisième partie de la construction <code>for</code>.</li> <li> <strong>Instruction 15 :</strong> c’est la fin du script.</li> </ul> <p>Cela devrait vous aider à comprendre l’enchainement logique des quelques lignes d’opcodes reproduites ci-dessus ;-)</p> <h1>D’autres extensions ?</h1> <p>Pour cet article, j’ai choisi de parler quasi-exclusivement de l’extension VLD.</p> <p>Cela dit, il existe d’autres extensions qui permettent d’accéder aux opcodes d’un script PHP. <br>Je pense notamment aux extensions <code>Bytekit</code> et <code>Parsekit</code>.</p> <p>La première, <strong><code>Bytekit</code></strong>, dont on peut trouver les <a href="https://github.com/Mayflower/Bytekit">sources sur github</a>, est connue en partie gràce à l’outil <a href="https://github.com/sebastianbergmann/bytekit-cli"><code>bytekit-cli</code></a> ; cet utilitaire en ligne de commande permet d’utiliser l’extension <code>Bytekit</code> pour effectuer certains types d’analyses de code, comme la détection d’utilisation de certains opcodes.</p> <p>La seconde, <strong><code>Parsekit</code></strong>, est <a href="http://pecl.php.net/package/parsekit">disponible sur PECL</a>, et exporte au code PHP <a href="http://fr2.php.net/manual/en/ref.parsekit.php">quelques fonctions</a> qui permettent d’obtenir des listes d’opcodes correspondant à du code PHP, depuis un script PHP.</p> <p>Cela dit, ces deux extensions ne me semblent plus tellement maintenues :</p> <ul> <li>Pour <code>Bytekit</code>, les sources que l’on trouve sur github semblent correspondre à une copie de la dernière version “officiellement publiée” des sources : elles ont été importées vers github en mai 2011, et jamais modiées depuis — le site officiel n’existe plus, d’ailleurs.</li> <li>Et pour Parsekit, la dernière version a été diffusée en 2009 ; la précédente remontant à 2006.</li> </ul> <p>Voila pourquoi j’ai préféré parler de VLD tout au long de cet article, cette extension ayant été mise à jour pour la dernière fois suite à la sortie de PHP 5.4.</p> <h1>Liens :</h1> <ul> <li>Sur le <a href="http://blog.golemon.com/">blog de Sara Golemon</a>, quelques articles de 2006-2008 sur le sujet des opcodes : <ul> <li><a href="http://blog.golemon.com/2008/01/understanding-opcodes.html">Understanding Opcodes</a></li> <li><a href="http://blog.golemon.com/2006/06/how-long-is-piece-of-string.html">How long is a piece of string</a></li> <li><a href="http://blog.golemon.com/2006/05/last-month-at-phptek-i-gave.html">Compiled Variables</a></li> </ul> </li> <li>A propos de l’extension VLD : <ul> <li> <a href="http://pecl.php.net/package/vld">VLD</a> : la page du package sur PECL</li> <li> <a href="http://derickrethans.nl/projects.html#vld">VLD - Vulcan Logic Dumper</a> : la page du projet sur le site de <a href="http://derickrethans.nl/">Derick Rethans</a>, son auteur <em>(aussi auteur de l’extension <a href="http://xdebug.org/">Xdebug</a>)</em> </li> <li><a href="http://derickrethans.nl/more-source-analysis-with-vld.html">More source analysis with VLD</a></li> </ul> </li> <li>D’autres extensions et outils : <ul> <li><a href="https://github.com/Mayflower/Bytekit">Bytekit</a></li> <li> <a href="https://github.com/sebastianbergmann/bytekit-cli">bytekit-cli</a> : les sources de <code>bytekit-cli</code>, sur github</li> <li> <a href="http://sebastian-bergmann.de/archives/871-bytekit-cli.html">bytekit-cli</a> : la présentation de l’outil <code>bytekit-cli</code> par son auteur, <a href="http://sebastian-bergmann.de/">Sebastian Bergmann</a>.</li> <li> <a href="http://pecl.php.net/package/parsekit">Parsekit</a> sur PECL ; et la <a href="http://fr2.php.net/parsekit">section correspondante du manuel</a>.</li> </ul> </li> </ul> <p><br></p> <p>Au cours de cet article, nous avons vu comment installer l’extension VLD pour obtenir un dump des opcodes correspondant à un script PHP. Nous avons aussi étudié les dumps correspondant à des exemples relativement simples, afin de comprendre leur structure et de nous familiariser avec les opcodes, leur syntaxe, et la logique de leur enchainement.</p> <p>Dans quelques jours, <strong>je publierai un second article sur le sujet des opcodes</strong>, où je montrerai comment utiliser VLD pour obtenir un graphe des chemins correspondant à un dump d’opcodes — et donc, au code PHP initialement écrit.</p> <p>Et je profiterai de l’occasion pour montrer que, des fois, mettre à jour PHP est une bonne idée ;-)</p> <p><br></p> <div class="footnotes"> <hr> <ol> <li id="fn:nostalgie-assembleur"> <p>Et peut-être ceux qui ont eu la chance de faire un peu d’Assembleur dans leur jeune temps ? Et qui regretteraient cette <em>bonne vieille époque</em> ? <a href="#fnref:nostalgie-assembleur">↩</a></p> </li> <li id="fn:vld-beta"> <p>L’extension VLD n’a jamais été marquée comme “stable”, je serais presque tenté de supposer que c’est fait exprès pour décourager ceux qui voudraient l’installer en production <em>(chose que, bien évidemment, vous n’avez pas à faire ^^)</em>. <a href="#fnref:vld-beta">↩</a></p> </li> <li id="fn:nostalgie-assembleur-2"> <p>A chaque fois que je vois un truc qui ressemble à ça, je ne peux m’empêcher de l’époque où j’ai eu l’occasion d’écrire un peu d’Assembleur Motorola 68000 — et, surtout, de lire celui que GCC générait lorsque je compilais du code C à destination de ma TI-92+, et que je voulais comprendre quelle écriture C donnait le code assembleur le plus efficace <em>(Sur 10 MHz, pour arriver à avoir un FPS raisonable, il fallait optimiser ; pas d’autre solution ^^)</em>. <br>Je n’en referais pas dans <em>“la vie de tous les jours”</em>, mais le petit sentiment de nostalgie est bien présent : après, qu’est-ce que c’était fun… <a href="#fnref:nostalgie-assembleur-2">↩</a></p> </li> </ol> </div> http://blog.pascal-martin.fr/post/php-obtenir-dump-opcodes#comment-new-form http://blog.pascal-martin.fr/post/php-obtenir-dump-opcodes#comment-new-form Ce mois-ci sur internals@php - Janvier 2013 http://blog.pascal-martin.fr/post/php-mailing-list-internals-janvier-2013?utm_source=rss2&utm_medium=feed&utm_campaign=php-mailing-list-internals-janvier-2013 http://blog.pascal-martin.fr/post/php-mailing-list-internals-janvier-2013 Mon, 11 Feb 2013 07:00:00 +0100 Pascal MARTIN phpinternals@ <p> </p> <p>Ce <strong>premier mois de l’année 2013</strong><sup id="fnref:pas-en-avance"><a href="#fn:pas-en-avance">1</a></sup> a été plutôt agité sur <code>internals@</code>, avec <strong>1082 mails</strong> <em>— la barre des 1000 mails sur le mois ayant été pour les deux dernières fois franchie en avril 2012 et en juin 2011 ; pas tous les jours, donc</em>. <br>Sous forme d’un graphique représentant le nombre de mails par mois sur les trois dernières années, on obtient <em>(l’historique depuis 1998 est disponible <a href="http://blog.pascal-martin.fr/public/internals-php/nombre-de-mails-internals-2013-01-historique-complet.png">ici</a>)</em> :</p> <p><span style="display:block;text-align:center;"><a href="http://blog.pascal-martin.fr/public/internals-php/nombre-de-mails-internals-2013-01.png"><img alt-src="data:image/gif;base64,R0lGODdhAQABAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAAQABAAAIBAChBQQAOw==" alt="Nombres de mails sur internals@ ces trois dernières années" class="lazy" src="http://blog.pascal-martin.fr/public/internals-php/small-nombre-de-mails-internals-2013-01.png" width="448px" height="299px"></a></span></p> <p>Pour résumer de façon très rapide les quelques points principaux :</p> <ul> <li>L’idée d’intégrer le cache d’opcodes Zend Optimizer+ à PHP 5.5 est en cours de discussion, </li> <li>PHP 5.5 approche de la fin de versions alpha, et pourrait passer en phase de bêta <em>(qui marque la fin de l’ajout/modification de fonctionnalités)</em> début février, </li> <li>PHP 5.3 devrait recevoir des correctifs de sécurité pendant un an après la sortie de PHP 5.5 ; après quoi, cette version aura atteint sa fin de vie, </li> <li>La RFC sur les accesseurs n’est pas passée, </li> <li>Le sujet des annotations est revenu sur le devant de la scène en début de mois ; avant de s’essoufler.</li> </ul> <p><br></p> <h1>PHP 5.5 approche la bêta ; PHP 5.3 voit sa fin de vie à l’horizon</h1> <p>Pour ce qui est de <strong>PHP 5.5</strong>, la version <a href="http://news.php.net/php.internals/64821"><code>alpha3</code></a> est sortie le 10 janvier ; et elle a été suivie, deux semaines après, par la version <a href="http://news.php.net/php.internals/65145"><code>alpha4</code></a>, publiée le 24 janvier.</p> <p>En parallèle à la sortie de la 4ème version alpha, David Soria Parra <a href="http://news.php.net/php.internals/65152">a annoncé</a> que l’<code>alpha4</code> devrait être la dernière version alpha, et que la prochaine version de ce qui est en train de devenir PHP 5.5 devrait être la <strong><code>beta1</code>, prévue pour le 7 février</strong><sup id="fnref:beta1-7-fevrier"><a href="#fn:beta1-7-fevrier">2</a></sup>.</p> <p>Comme je <a href="http://blog.pascal-martin.fr/post/php-mailing-list-internals-decembre-2012">l’annonçais le mois dernier</a>, le passage en phase de versions bêta marque la <strong>fin de l’ajout/modification de fonctionnalités</strong> <em>(“feature-freeze”)</em> ; d’ici peu, nous devrions donc être fixés sur l’ensemble des nouveautés qu’apportera PHP 5.5 !</p> <p><br></p> <p>En parallèle, le sujet de la <a href="http://news.php.net/php.internals/64665">probable prochaine EOL de PHP 5.3</a> a été relancé par Pierre Joye, qui annonce quelques jours plus tard l’<a href="http://news.php.net/php.internals/64926">ouverture du vote</a> sur la <a href="https://wiki.php.net/rfc/php53eol">RFC: Define PHP 5.3 end of life</a>.</p> <p>Et tout juste en fin de mois, les résultats du vote <a href="http://news.php.net/php.internals/65247">sont connus</a> : une écrasante majorité <em>(31 votes pour)</em> de votants pense que <strong>PHP 5.3 devrait recevoir des correctifs de sécurité <em>(uniquement)</em> pendant un an, à partir de la sortie de PHP 5.5</strong> ; en citant Pierre Joye :</p> <blockquote> <p>That means PHP 5.3 end of life (no release, no support, etc.) will happen exactly one year after the release of PHP 5.5.0-stable. <br>The announce of the exact date will be done at the same time than the release announce for PHP 5.5.0.</p> </blockquote> <p>Autrement dit<sup id="fnref:traductions"><a href="#fn:traductions">3</a></sup> :</p> <blockquote> <p>Cela signifie que <strong>la fin de vie de PHP 5.3</strong> (plus de sortie de version, plus de support, …) aura lieu exactement <strong>un an après la publication de PHP 5.5.0-stable</strong>. <br>L’annonce de la date exactement sera faite en même temps que l’annonce de la publication de PHP 5.5.0.</p> </blockquote> <p>De son côté, Stas Malyshev se demande avec <a href="http://news.php.net/php.internals/64465">quelle fréquence les mises à jour mineures de PHP <em>(5.4, principalement, ici)</em> devraient être publiée</a>.</p> <p><br></p> <h1>Intégration d’un cache d’opcodes au coeur de PHP ?</h1> <p>Intégrer un cache d’opcodes <em>(de manière générale, l’idée tourne souvent autour d’APC)</em> au coeur de PHP est une idée qui revient fréquemment <em>(y compris sur <code>internals@</code>)</em> ; je me souviens d’une conférence organisée par l’AFUP à Lyon en 2007 ou 2008, alors que PHP 5.3 et PHP 6 étaient encore tous deux en plein développement, où j’avais discuté de ce sujet avec un des conférenciers.</p> <p>Et, presque immanquablement, dès l’annonce de l’approche de la feature-freeze de PHP 5.5, il est de nouveau fait mention de l’<a href="http://news.php.net/php.internals/65156">idée d’intégrer APC au core de PHP</a>.</p> <h2>APC manque de développeurs, et n’est pas en avance lorsqu’il s’agit de supporter une nouvelle version de PHP</h2> <p>Cela dit, tout n’est pas rose au royaume de l’<strong><a href="http://pecl.php.net/package/APC">extension APC</a> qui manque cruellement de développeurs</strong>. En citant Rasmus Lerdorf, qui <a href="http://news.php.net/php.internals/65159">essaye d’expliquer pourquoi aussi peu de développeurs travaillent sur APC</a> :</p> <blockquote> <p>It is probably the most complicated piece of the entire stack. <br>It is a an op_array juggler doing a complex dance on a tight rope backwards and blindfolded. <br>It is essentially multi-threaded in that there are multiple processes all reading and writing the same chunk of memory while dealing with a compiler that spits out context-sensitive op_arrays that were never designed to be cached and executed this way.</p> </blockquote> <p>Autrement dit :</p> <blockquote> <p>Il s’agit probablement de la portion la plus compliquée de l’ensemble de la pile. <br>C’est un jongleur d’op_array effectuant une dance complexe sur une fine cordre, en marche arrière, avec un bandeau sur les yeux. <br>Ce composant est principalement multi-threadé, puisqu’il gère plusieurs processus qui lisent et écrivent tous depuis le même bloc de mémoire, tout en travaillant avec un compilateur qui génère des listes d’opcodes dépendant du contexte qui n’ont jamais été conçues pour être cachées et exécutées de cette manière.</p> </blockquote> <p>Cela dit, il est extrêment réaliste, puisque, quelques phrases plus loin, il n’hésite pas à affirmer :</p> <blockquote> <p>The real issue here is robustness and lag time between a PHP release <br>and and solid APC release</p> </blockquote> <p>Soit :</p> <blockquote> <p>Le vrai problème est la robustesse et le délai entre la sortie d’une version de PHP <br>et la publication d’une version stable d’APC lui correspondant.</p> </blockquote> <p>En plus de cela, <strong>on peut craindre que les choses n’aillent pas en s’améliorant du côté d’APC dans les prochains mois</strong>, puisque qu’il affirme aussi :</p> <blockquote> <p>One thing I can guarantee is that if we add it to core in its current condition <br>it will delay 5.5 by 6+ months if not longer.</p> </blockquote> <p>Ce qui donne à la traduction :</p> <blockquote> <p>Une chose que je peux garantir est que si nous ajoutons APC au coeur dans son état actuel, <br>cela repoussera la sortie de PHP 5.5 de 6 mois, voire même plus.</p> </blockquote> <p>Bien entendu je ne peux qu’acquiesser lorsque Julien Pauli <a href="http://news.php.net/php.internals/65161">suggère</a> que plus de documentation pourrait aider ; mais si APC est aussi difficile à maintenir que son développeur principal le laisse entendre, j’ai peur que cela ne facilite que peu la prise en main par de nouveaux développeurs…</p> <p>Cela dit, un peu plus loin dans la conversation, Zeev Suraski <a href="http://news.php.net/php.internals/65171">indique</a> que le composant Optimizer+ de Zend fonctionne avec PHP 5.4 et 5.5, est gratuit depuis plusieurs années, et qu’il serait envisageable de l’open-sourcer pour qu’il soit intégré au core de PHP <em>(même si, comme pour APC, une partie du code date un peu et n’est pas nécessairement parfaite)</em>, et Rasmus Lerdorf <a href="http://news.php.net/php.internals/65175">semble d’accord</a> avec cette idée, le <strong>but premier étant d’apporter une solution de cache d’opcode intégrée à PHP</strong> <em>(sous-entendu, quelque soit son origine, que ça vienne de Zend ou de la communauté au départ)</em>.</p> <p>Bien sûr, comme <a href="http://news.php.net/php.internals/65204">le souligne</a> Anthony Ferrara, il risque d’être difficile de mettre ceci en place <em>(d’autant plus qu’une RFC implique théoriquement un délai minimal de deux semaines)</em> avant la sortie de la version <code>beta1</code> et le gel de fonctionnalités correspondant ; il serait peut-être alors nécessaire de rajouter une version <code>alpha5</code>, et de décaler la sortie de la <code>beta1</code> en conséquence.</p> <h2>Intégrer Zend Optimizer+ à PHP ?</h2> <p>Suite aux échanges dont je parlais au-dessus, Zeev Suraski a <a href="http://news.php.net/php.internals/65321">annoncé</a> en toute fin de mois qu’il avait rédigé une <strong>RFC proposant d’intégrer le cache d’opcodes Zend Optimizer+, aujourd’hui closed-source mais gratuit, dans PHP</strong> : <a href="https://wiki.php.net/rfc/optimizerplus">RFC: Integrating Zend Optimizer+ into the PHP distribution</a> — au passage, il serait <strong>rendu open-source par Zend</strong> <em>(le processus est déjà en cours, <a href="http://news.php.net/php.internals/65408">il semblerait</a>)</em>.</p> <p>Les résultats de benchmarks publiés avec la RFC indiquent que <strong>Zend Optimizer+ s’en sort plutôt bien au niveau performances</strong> <em>(notamment comparé à APC, il ne fait généralement pas “pire”, voire même est “meilleur”)</em> ; et cette extension <strong>supporte déjà les nouveautés apportées par PHP 5.5</strong>, et a très tôt été disponible pour PHP 5.4 <em>(contrairement au cache d’opcodes APC, qui est le plus “populaire”, et qui a mis fort longtemps avant d’être vraiment compatible avec PHP 5.4)</em>.</p> <p><a href="http://news.php.net/php.internals/65322">Quelques</a> <a href="http://news.php.net/php.internals/65326">voix</a> s’élèvent pour souligner que <strong>Zend Optimizer+ ne supporte pas ZTS</strong> <em>(Zend Thread Safety — PHP en mode multi-threads)</em>, et que c’est un point qui pourrait être considéré comme bloquant ; mais il <a href="http://news.php.net/php.internals/65325">semblerait</a> que le support de ZTS puisse être re-mis en place sans trop de difficulté — et, dans le contexte d’un serveur Web, ceci n’est problématique que pour les installations de PHP sous Windows, en mode non-FastCGI <em>(la majorité des utilisations de PHP se faisant en mode multi-processus, et pas multi-threads)</em>.</p> <p>Pour résumer brièvement ce que j’indiquais au-dessus pour ceux qui s’interrogent sur la possibilité d’intégrer APC plutôt que O+, en l’état actuel des choses et comme <a href="http://news.php.net/php.internals/65389">le souligne</a> Rasmus Lerdorf, APC manque cruellement de mainteneurs <em>(il semble y avoir plus de développeurs sur internals qui connaissent les sources de O+, qui n’est pour l’instant pas open-source, que de contributeurs à APC !)</em>, ce qui rend d’après lui cette idée non-viable.</p> <p>Cela dit, quelques <a href="http://news.php.net/php.internals/65377">autres</a> développeurs ayant travaillé sur APC par le passé ne semblent pas prendre d’un très bon oeil l’intégration d’un autre outil à PHP <em>(surtout jusqu’à présent développé en closed-source, en dehors de php.net)</em> — alors que cela fait des années que l’idée d’intégrer APC au core revient fréquemment sur le tapis.</p> <p>Intégrer O+ à PHP 5.5 pourrait <strong>repousser la sortie de cette future version d’environ deux mois</strong>, notamment pour se donner le temps de stabiliser <em>(tester / valider)</em> l’ensemble ; <a href="http://news.php.net/php.internals/65339">nombreux</a> <a href="http://news.php.net/php.internals/65345">sont</a> <a href="http://news.php.net/php.internals/65441">ceux</a> <a href="http://news.php.net/php.internals/65346">qui considérent</a> qu’un délai supplémentaire de deux mois est acceptable, considérant le gain que représenterait un cache d’opcodes inclu dans le core ; <a href="http://news.php.net/php.internals/65343">d’autres</a>, néanmoins, trouvent qu’il serait dommage de repousser la sortie de PHP 5.5 pour cela, alors qu’il existe des alternatives ; et enfin, <a href="http://news.php.net/php.internals/65356">certains</a> ne sont pas contre un délai, mais notent fort justement que repousser une version de PHP pour ajouter une fonctionnalité doit être une exception bien cadrée, et ne pas devenir une habitude.</p> <p>En réponse, David Soria Parra <em>(co-release-manager pour PHP 5.5)</em> indique qu’une possibilité serait de ne pas retarder la sortie de la première bêta de PHP 5.5, et d’intégrer O+ pour une version bêta ultérieure, même si “bêta” est censée signifier “feature-freeze” ; pour l’instant, cette proposition n’a pas été suivie de retour.</p> <p>Notons que la discussion s’est étendue aux interactions entre O+ et d’autres extensions proches, en termes de fonctionnement, du coeur de PHP, comme Xdebug ou Zend Guard Decoder, afin de s’assurer que l’intégration de l’une ne constitue pas un problème pour les autres.</p> <p>Arrivés en fin de mois, les choses en sont là : <strong>l’idée d’intégrer Zend Optimizer+ dans le core de PHP est lancée</strong>, la RFC est rédigée et <strong>les retours sont dans l’ensemble assez positifs</strong>, même si cela peut signifier qu’il faille <strong>éventuellement repousser la sortie de PHP 5.5 de deux mois</strong>. Nous verrons dans les prochaines semaines l’évolution que prendra cette proposition !</p> <h2>ZTS : Zend Thread Safety</h2> <p>Plus ou moins suite à la discussion autour de Zend Optimizer+, qui ne supporte pour l’instant pas ZTS <em>(Zend Thread Safety)</em>, Zeev Suraski a demandé pourquoi est-ce que <a href="http://news.php.net/php.internals/65332">certains</a> développeurs utilisent ZTS — autrement dit, pourquoi est-ce que certains utilisent PHP en mode multi-threads plutôt qu’en mode multi-processus.</p> <p>Il s’agissait uniquement d’une <strong>discussion visant à déterminer l’utilité, aujourd’hui, de ZTS</strong>, et pas à arriver à une quelconque décision quant à son avenir — je ne fais donc ici que rapporter quelques éléments d’information :</p> <ul> <li>Alexey Zakhlestin a fort justement <a href="http://news.php.net/php.internals/65334">fait remarquer</a> que ZTS est un pré-requis pour des extensions comme <a href="https://github.com/krakjoe/pthreads">pthreads</a>, qui permet justement d’utiliser des threads depuis du code PHP ; il en va de même pour quelques autres extensions, comme la fonctionalité de <a href="http://www.php.net/manual/en/runkit.sandbox.php">sandbox de runkit</a>.</li> <li>Laruence <a href="http://news.php.net/php.internals/65335">a répondu</a> que ZTS est important pour les utilisateurs ayant PHP tournant sous IIS ou Apache avec le MPM workers <em>(alors que FastCGI est censé être plus rapide et plus robuste)</em>.</li> <li>Pierre Joye <a href="http://news.php.net/php.internals/65341">aimerait bien</a> supprimer tout ce qui est TSRM <em>(Thread Safe Resource Management)</em> et passer à du LTS <em>(Thread Local Storage)</em> ; mais il reste le problème de Windows, où se reposer sur un mode multi-processus est peu efficace. Il <a href="http://news.php.net/php.internals/65361">estime</a> par ailleurs qu’arrêter de penser à la thread safety serait une grosse erreur</li> <li>Johannes Schlüter <a href="http://news.php.net/php.internals/65363">a fait noter</a> qu’un bug de multi-threading a été reporté quelque chose comme un an après la sortie de PHP 5.4, et que vu l’importance du bug en question, il semblerait que le multi-thread ne soit qu’assez peu testé.</li> <li>Indépendamment du coeur de PHP en lui-même, certains composants ne sont pas TS — tout ce qui est locale, <a href="http://news.php.net/php.internals/65436">par exemple</a>.</li> <li>Johannes Schlüter <a href="http://news.php.net/php.internals/65398">a aussi fait remarquer</a> — et c’est notamment gênant en hébergement mutualisé — qu’il suffit, avec l’implémentation ZTS actuelle, d’un script avec une stack overflow pour tuer un processus entier ; et donc, tous les threads qu’il héberge <em>(tombant en cascade d’autres requêtes exécutées en parallèle)</em>. Pour lui, simplifier la base de code <em>(sous-entendu : en supprimant ce qui est TSRM)</em> serait bénéfique, même s’il est possible que supprimer le mode multi-threads puisse avoir un impact négatif sur les performances dans certains cas d’utilisation.</li> <li>Bas van Beek <a href="http://news.php.net/php.internals/65497">a pour sa part apporté</a> un point de vue que l’on rencontre rarement : il utilise PHP en embed dans des applications C/C++ fortement threadées — et donc, pour lui, ZTS est un élément important ; cela dit, Zeev Suraski <a href="http://news.php.net/php.internals/65498">a répondu</a> qu’il est d’accord sur l’importance de ZTS dans ce type de cas, et que c’est dans le contexte d’un serveur web multi-threadé qu’il posait la question ; néamoins, prêter moins largement attention à ZTS au niveau de l’équipe de développement de PHP signifierait probablement, en cascade, moins d’efforts au niveau des extensions…</li> </ul> <p><br></p> <h1>RFC et processus de vote</h1> <p>Suite aux votes sur plusieurs RFC et fonctionnalités controversées, Anthony Ferrara <a href="http://news.php.net/php.internals/65285">s’est posé</a> la question suivante : <strong>lors du vote sur une RFC, sur quoi exactement le vote doit-il porter ?</strong> Sur l’idée même de la <strong>fonctionnalité</strong> proposée par la RFC ? Ou sur l’<strong>implémentation</strong> qui accompagne généralement celle-ci ?</p> <p>Les réponses sont assez variées, prouvant que chacun interprête les choses à sa façon : Pierre Joye <a href="http://news.php.net/php.internals/65293">remarque</a> que les votes ne portent que sur des RFC accompagnées de patches <em>(et donc, d’une implémentation)</em>, alors que Zeev Suraski <a href="http://news.php.net/php.internals/65296">souligne</a> qu’il n’est que rarement demandé de voter pour des modifications de code <em>(hors nouvelles fonctionnalités)</em> et que les concepts devraient être plus importants que leurs implémentations. Les deux points de vue ont trouvé echo, pour autant que je puisse en juger.</p> <p>Dans les faits, aujourd’hui, voter “pour” une RFC signifie accepter que l’implémentation l’accompagnant soit mergée dans la base de code de PHP — et donc, cette implémentation a un poids fort dans la décision. Est-ce quelque chose qui pourrait changer à l’avenir, par exemple avec des RFC votées alors qu’elles n’en sont qu’à la phase d’idée non accompagnée d’une implémentation ?</p> <p>Quelques jours plus tard, Zeev Suraski <a href="http://news.php.net/php.internals/65226">remet en question</a> une partie du processus de votes ; en particulier, suite au vote sur la <a href="https://wiki.php.net/rfc/propertygetsetsyntax-v1.2">RFC des accesseurs</a>, il note que <strong>les votes n’ont pas toujours de durée bien cadrée</strong>.</p> <p>David Soria Parra, pour ne citer qu’<a href="http://news.php.net/php.internals/65438">un avis</a>, est d’accord sur le principe proposé au-dessus : un vote devrait avoir une date de début et une date de fin clairement définies dès que celui-ci est ouvert.</p> <p>Anthony Ferrara <a href="http://news.php.net/php.internals/65292">note</a> que ceux qui ne participent pas à la discussion sur <code>internals@</code> autour d’une RFC ne devraient pas être autorisés à voter sur ladite RFC — le but étant de tenir compte des avis de ceux qui ont prêté suffisament attention à la RFC pour prendre part aux échanges qui l’ont accompagnés.</p> <p>Au cours de ces différents échanges, on peut noter que Zeev Suraski <a href="http://news.php.net/php.internals/65271">est réaliste</a> sur “la communauté” vs “les développeurs” : il fait remarquer, fort justement, que l’immense majorité des utilisateurs de PHP est <em>silencieuse</em> : pour chaque personne inscrite à <code>internals@</code>, il existe un milier de développeurs qui ne suivent pas ce qu’il s’y passe, les discussions qui y ont lieu, et ne participent pas aux décisions qui impactent le langage.</p> <p>D’ailleurs, Pierre Joye en <a href="http://news.php.net/php.internals/65272">remet une couche</a> lors qu’il affirme :</p> <blockquote> <p>I think many of us are purely and simply totally out of sync with our users. <br>I have no immediate solution but this is something we must solve, now.</p> </blockquote> <p>Autrement dit, en français :</p> <blockquote> <p>Je pense que beaucoup d’entre nous sont purement et simplement désynchronisés par rapport à nos utilisateurs. <br>Je n’ai pas de solution immédiate, mais c’est un problème que nous devons résoudre, maintenant.</p> </blockquote> <p>Zeev Suraski <a href="http://news.php.net/php.internals/65295">insiste</a> par la suite sur le fait que PHP est devenu aussi populaire comme langage de programmation “web” sans les fonctionnalités qui lui ont été ajoutées ces dernières années ni celles en cours de débat, et que nombre de développeurs sont tout à fait content sans — en fait, d’après lui, ils seraient même plus content sans ces nouveautés, qui rendent le langage plus complexe qu’il ne l’était à une époque. Et même sur <code>internals@</code>, il <a href="http://news.php.net/php.internals/65300">n’est pas le seul</a> à être de cet avis.</p> <p>Ryan McCue <a href="http://news.php.net/php.internals/65311">apporte le point de vue</a> d’un développeur s’intéressant au développement de WordPress, ce à quoi Larry Garfield <a href="http://news.php.net/php.internals/65316">répond</a> que ce problème de l’oeuf et de la poule n’est pas sans solution : un effort pour pousser à la migration vers une version plus récente de PHP, tel que le mouvement GoPHP5 d’il y a quelques années, peut être efficace. <br>Cela dit, si WordPress, en tant qu’application PHP très répandue, commençait dès maintenant <a href="http://news.php.net/php.internals/65320">à encourager à utiliser PHP 5.3/4</a> dans ses <a href="http://wordpress.org/about/requirements/">requirements</a>, cela serait déjà une si bonne chose…</p> <p><br></p> <h1>Grosses discussions — sans résultat immédiat — sur les accesseurs, et sur les anotations</h1> <p>Deux séries de discussions et d’échanges, allant jusqu’à la rédaction de RFCs <em>(et même jusqu’à la phase de vote pour certaines d’entre elles)</em>, ont eu lieu ce mois-ci, sans qu’aucune nouvelle fonctionnalité ne soit finalement ajoutée à PHP.</p> <h2>Ajouter une fonctionnalité d’accesseurs à PHP ?</h2> <p>Les multiples discussions sur les accesseurs sont sans aucun doute un des gros sujets de ce mois-ci sur <code>internals@</code> :</p> <p>Clint Priest travaille depuis plusieurs mois sur la <strong>mise en place d’accesseurs de propriétés</strong> ; il <a href="http://news.php.net/php.internals/64469">a annoncé en début de mois</a> que la <a href="https://wiki.php.net/rfc/propertygetsetsyntax-v1.2">RFC: Property Accessors Syntax</a> était sur le point d’être soumise aux votes, et demandait donc une relecture finale. Avec plus de 50 mails dans la discussion, c’est un sujet qui a semblé intéresser du monde !</p> <p>Dans la suite logique des discussions évoquées au-dessus ainsi que de celles de ces derniers mois, Clint Priest <a href="http://news.php.net/php.internals/65011">a ouvert les votes</a> sur sa proposition tout juste milieu janvier ; il était prévu, si la RFC passait, que cette fonctionnalité soit ajoutée à PHP 5.5.</p> <p>Dans le fil de discussion, un <a href="http://news.php.net/php.internals/65091">avis de Rasmus Lerdorf</a> — je ne cite qu’un intervenant et un mail, mais c’est loin d’être le seul qui aurait de quoi être attirer l’attention :</p> <blockquote> <p>The simple explanation from me is that the ROI isn’t there on this one. <br>It adds a lot of code complexity for very little return. Yes, it saves a couple of lines of boilerplate code for a few people, but the cost is high in terms of ongoing maintenance and potential issues for opcode caches as well. <br>If you look at the split in voting you will notice it is pretty much split along the lines of the people who have to maintain this code vs. the people who would like a shiny new feature.</p> </blockquote> <p>Soit, en français :</p> <blockquote> <p>L’explication simple pour moi est que le retour sur investissement n’est pas intéressant pour ce point. <br>Il entraine l’<strong>ajout de beaucoup de complexité</strong> au code, pour un <strong>gain faible</strong> en échange. Oui, cela économise quelques lignes de code pour quelques personnes, mais le <strong>coût est élevé</strong> en termes de <strong>maintenance</strong> et de <strong>problèmes potentiels pour les caches d’opcodes</strong>. <br>Si on jette un coup d’oeil au partage des votes, on remarquera que la séparation se fait à peu près entre les gens qui auraient à maintenir ce code d’une part, et ceux qui voudraient une nouvelle fonctionnalité d’autre part.</p> </blockquote> <p><em>(Les choses <a href="http://news.php.net/php.internals/65101">ne sont pas</a> nécessairement <a href="http://news.php.net/php.internals/65103">aussi noires ou blanches</a>, mais je trouve intéressante la distinction faite par le créateur du langage entre “les gens qui maintiennent le code” — les développeurs de PHP — et “les gens qui voudraient une nouvelle fonctionnalité” — les utilisateurs de PHP)</em></p> <p>En parallèle, Nikita Popov <a href="http://news.php.net/php.internals/64520">a proposé une syntaxe alternative</a>, et a rédigé la <a href="https://wiki.php.net/rfc/propertygetsetsyntax-alternative-typehinting-syntax">RFC: Alternative typehinting syntax for accessors</a> ; cette proposition semblait rencontrer des avis plutôt positifs, et elle a donc été elle aussi <a href="http://news.php.net/php.internals/65053">ouverte aux votes</a> — il est intéressant de noter <em>(je crois que c’est la première fois que je vois le cas se produire)</em> que cette RFC concerne un changement non pas sur une fonctionnalité existante de PHP, mais sur une fonctionnalité en cours de vote <em>(et donc, si cette RFC passe, il faudra pour qu’elle soit appliquée que la première passe elle-aussi)</em>.</p> <p>Dans le fil des échanges, on arrive tout de même à <a href="http://news.php.net/php.internals/65056">de jolies perles</a>, comme, par exemple :</p> <blockquote> <p>I’m against Accessors as well so if it goes through then I’ll definitely be stopping with PHP5.4 <br>and ensuring that remains available for the rest of my active programming life … <br>something I wish I’d done now with 5.2!</p> </blockquote> <p>Soit, après traduction :</p> <blockquote> <p>Je suis moi aussi opposé aux Accesseurs donc si cette fonctionnalité passe, je m’arrêterai clairement à PHP 5.4 <br>et m’assurerai que cette version reste disponible pour le restant de ma vie de développement actif… <br>quelque chose que je regrette finalement de ne pas avoir fait avec PHP 5.2 !</p> </blockquote> <p>Et alors même que les deux RFC pointées plus haut étaient en phase de vote <em>(les “oui” ne devancent que de peu les “non” sur la première, alors que pour passer, il faudrait 2/3 de “oui”)</em>, Steve Clay <a href="http://news.php.net/php.internals/65120">a lancé un nouveau sujet de discussion</a>, où il a essayé d’introduire une nouvelle propostion, qui pourrait être perçue comme <em>plus simple</em> — ce à quoi Clint Priest n’a pu que <a href="http://news.php.net/php.internals/65123">répondre</a> que, finalement, une des versions précédentes de sa RFC correspondait à peu près à cette <em>nouvelle</em> idée ; et que nombreux ont été ceux à demander les fonctionnalités ajoutées depuis…</p> <p>Alors que la phase de votes touchait à sa fin, <a href="http://news.php.net/php.internals/65296">il a semblé</a> que Clint Priest et Nikita Popov <a href="http://news.php.net/php.internals/65244">abandonnaient</a>, considérant que leurs propositions avaient reçu beaucoup de votes “non” <em>(dans les faits, plus de 20 votes “contre” et plus de 30 votes “pour” ; ce qui est insuffisant, puisqu’une modification du langage demande deux tiers de “pour” pour être acceptée)</em> ; et <a href="http://news.php.net/php.internals/65488">ce fut confirmé</a> quelques jours plus tard, avec 34 “pour” et 22 “contre”.</p> <p>Donc, après plusieurs mois d’échanges : pour l’instant, <strong>la fonctionnalité d’accesseurs ne sera pas ajoutée à PHP 5.5</strong> — ni à aucune version, tant qu’elle n’aura pas été revue de manière à arriver à un concensus.</p> <h2>Le retour des discussions sur les annotations</h2> <p>Yahav Gindi Bar <a href="http://news.php.net/php.internals/64609">a relancé le sujet des annotations</a>, en proposant la <a href="https://wiki.php.net/rfc/reflection_doccomment_annotations">RFC: Reflection Annotations using the Doc-Comment</a>.</p> <p>En soit, <strong>l’idée des annotations semble appréciée par pas mal de monde</strong> <em>(elles sont utilisées par plusieurs “gros” frameworks genre Doctrine / symfony / Zend Framework)</em> ; par contre, la proposition faite ici utilise une syntaxe qui n’est pas compatible avec celle utilisée “ailleurs”.</p> <p>Comme <a href="http://news.php.net/php.internals/64622">l’a fait remarquer</a> Pierrick Charron, ce n’est pas tout à fait la première fois que le sujet est abordé : il existe même déjà une première RFC : <a href="https://wiki.php.net/rfc/annotations-in-docblock">Annotations in DocBlock</a> ; Clint Priest a aussi <a href="http://news.php.net/php.internals/64722">pointé</a> vers <a href="https://wiki.php.net/rfc/annotations">RFC: Class Metadata</a>, qui avait été proposée en 2010 par Guilherme Blanco… et qui n’était pas passée.</p> <p>Mais, encore une fois, <strong>l’opposition est vocale</strong> ; par exemple, Derick Rethans <a href="http://news.php.net/php.internals/64725">avance</a> que chaque application/framework utilisant ses propres conventions, un parser d’annotations n’a pas sa place dans le core de PHP. <br>Cependant, ici aussi, d’autres <a href="http://news.php.net/php.internals/64662">soutiennent</a> qu’utiliser des DocBlocks pour travailler avec des annotations est un <em>hack</em>, et que cette fonctionnalité aurait sa place dans le core.</p> <p>Enfin, bref ; <strong>j’ai l’impression de voir l’histoire se répéter</strong> <em>(les échanges se sont étalés sur une grosse centaine de mails, répartis sur trois sujets de discussion principaux)</em>, avec d’un côté <em>“les annotations c’est bien, ça devrait être dans le core de PHP”</em>, et de l’autre <em>“les annotations n’ont rien à faire dans le code de PHP”</em>, avec, au milieu de tout ça, quelques remarques sur la <a href="http://news.php.net/php.internals/64710">séparation documentation/comportement</a>, des interrogations à propos des <a href="http://news.php.net/php.internals/64758">caches d’opcodes</a>, et des exemples <a href="http://news.php.net/php.internals/64730">volontairement exagérés</a> pour être illisibles.</p> <p>Il y a plus de deux ans, en 2010, le camp du “contre” avait remporté une bataille… Cette fois-ci, <strong>la discussion s’est essouflée d’elle-même au bout de quelques jours</strong>… Mais qui sait, les annotations ne sont pas le premier sujet à revenir régulièrement sur <code>internals@</code>, le sujet avance un petit peu à chaque fois, et peut-être qu’un jour…</p> <p><br></p> <h1>De nombreux petits changements et améliorations</h1> <p>Je ne pense pas qu’il soit nécessaire d’écrire des paragraphes entiers à ce sujet, mais puisque cela a fait un peu de bruit : suite aux échanges, parfois houleux, qui ont eu lieu début janvier autour du sujet des annotations, Anthony Ferrara <a href="http://news.php.net/php.internals/64770">estime que “PHP a besoin d’une vision”</a> : plutôt que de laisser chacun partir dans son coin, développer une fonctionnalité et rédiger la RFC correspondante et les soumettre à un vote, d’après lui, <strong>PHP aurait besoin d’une ligne de conduite générale</strong>.</p> <p>Forcément, les avis en réponses divergent en fonction de chacun ; d’aucun sont satisfait du mode de fonctionnement actuel, d’autres préféreraient que PHP reste “simple”, et les derniers voudraient quasiment que toute fonctionnalité imaginée et imaginable soit ajoutée à PHP.</p> <p>Finalement, il n’est pas ressorti grand chose des échanges qui ont suivi ; la discussion s’est essouflée ; et, tout au moins à court terme, aucun changement n’est visible quant aux processus d’ajout de fonctionnalité à PHP.</p> <p><br></p> <p>Le vote sur la RFC <a href="https://wiki.php.net/rfc/array_column"><code>array_column()</code></a> a enfin <a href="http://news.php.net/php.internals/64870">été ouvert</a>.</p> <p>Au départ deux noms de fonctions <em>(<code>array_column()</code> et <code>array_pluck()</code>)</em> étaient proposés ; finalement, seul le premier a été retenu — bien entendu le plus gros de la discussion a porté sur le nom à donner à cette fonction, et non pas sur la fonctionnalité en elle-même.</p> <p>Avec 29 votes “pour”, et 6 votes “contre”, il semblerait que cette fonction ait de bonnes chances d’être présente dans PHP 5.5 — reste à ce que le code correspondant soit mergé avant le gel des fonctionnalités prévu pour dans quelques jours !</p> <p><br></p> <p>Le vote sur la <a href="https://wiki.php.net/rfc/incompat_ctx">RFC: Remove calls with incompatible Context</a>, qui avait été rédigée cet été, a été ouvert par Gustavo Lopes en milieu de mois.</p> <p>Une semaine après, <strong>la RFC est passée à l’unanimité</strong> <em>(15 votes “pour”, et 0 vote “contre”)</em> ; et le changement devrait être effectif pour PHP 5.5 — notons que malgré le nom de la RFC, il s’agit uniquement, pour PHP 5.5, d’un marquage comme <code>deprecated</code>.</p> <p><br></p> <p>Stas Malyshev a proposé une solution pour <a href="http://news.php.net/php.internals/64598">sécuriser l’upload de fichier avec ext/cURL</a>, et a rédigé la RFC correspondante : <a href="https://wiki.php.net/rfc/curl-file-upload">RFC: Fix CURL file uploads</a>.</p> <p>Pour ceux qui voudraient plus d’explications sur la problématique de sécurité, <a href="http://news.php.net/php.internals/65557">ce mail</a> de Stas Malyshev peut être une lecture intéressante.</p> <p>Les votes <a href="http://news.php.net/php.internals/65049">ont été ouverts</a> le 21 janvier, et devraient donc s’achever dans quelques jours. Les résultats étant plutôt positifs pour l’instant, il y a de <a href="http://news.php.net/php.internals/65297">fortes chances</a> que la classe <code>CURLFile</code> soit présente dans la prochaine version de PHP.</p> <p><br></p> <p>Suite à <a href="http://www.reddit.com/r/PHP/comments/174qng/lets_make_phps_function_names_consistent/">une discussion sur reddit</a> autour du <a href="https://bugs.php.net/bug.php?id=52424">Bug #52424</a>, Damian Tylczyński <a href="http://news.php.net/php.internals/65166">a remis sur le tapis</a> le sujet de l’inconsistence des noms de fonctions fournies par PHP.</p> <p>C’est un débat qui revient fréquemment <em>(ce n’est pas le seul — et des fois, au bout de plusieurs années, les choses changent ; ça a par exemple été le cas il y a quelques mois pour la déprécation de <code>ext/mysql</code>)</em> sur la mailing-list <code>internals@</code>, entre ceux qui voudraient uniformiser les noms de fonctions <em>(et, des fois, les ordres de paramètres, aussi)</em>, et ceux qui rappellent que la compatibilité avec les versions précédentes est une règle importante de PHP.</p> <p>D’ailleurs, comme <a href="http://news.php.net/php.internals/65181">le souligne</a> Stas Malyshev, pour ceux d’entre nous qui travaillent avec des bases de code existantes de grande taille, cette <em>uniformisation</em> n’apporterait absolument rien — sinon la nécessité de retoucher et retester des centaines de milliers de lignes de code.</p> <p><br></p> <p>Quelques modifications visant à <strong>améliorer les performances de PHP</strong> ont été effectuées :</p> <ul> <li>Autour des <a href="http://news.php.net/php.internals/64693">manipulation de dates</a>,</li> <li>Pour la fonction <a href="http://news.php.net/php.internals/64789"><code>strtr()</code></a> ; <a href="http://news.php.net/php.internals/64954">certains</a> ont exprimé le souhait que ceci soit mergé sur les branches de PHP 5.4 et de PHP 5.5 ; alors que d’<a href="http://news.php.net/php.internals/64962">autres répondaient</a> qu’il y avait un risque de régression, et qu’il valait mieux garder ce type de nouveauté pour 5.5. Finalement ce point <a href="http://news.php.net/php.internals/64973">a été mergé sur PHP 5.4</a>.</li> <li>Quelques <a href="http://news.php.net/php.internals/65003">optimisation pour ARM</a>.</li> </ul> <p><br></p> <p>Et, pour finir, voici encore quelques points intéressant, même si je n’estime pas utile d’en parler plus en profondeur :</p> <ul> <li>En début de mois, Gustavo Lopes a annoncé l’<a href="http://news.php.net/php.internals/64753">ouverture des votes</a> pour la <a href="https://wiki.php.net/rfc/zpp_improv">RFC: <code>zend_parse_parameters()</code> improvements</a> ; deux semaines après, avec 9 votes “pour” et 0 vote “contre”, la modification <a href="http://news.php.net/php.internals/65000">a été mergée vers PHP 5.5</a>.</li> <li>Il a aussi <a href="http://news.php.net/php.internals/65092">annoncé</a> la <a href="https://wiki.php.net/rfc/sendrecvmsg">RFC: send/recvmsg() wrappers in <code>ext/socket</code></a> ; c’est le genre de cas pour lequel une RFC ne serait à mes yeux pas nécessaire <em>(ajout à une extension PHP d’une fonction présente dans la bibliothèque encapsulée par cette extension)</em>, mais il est appréciable de voir le principe des RFC appliqué de manière sérieuse ; quoi qu’il en soit, puisqu’aucun retour <em>(ni positif, ni négatif)</em> n’a été fait, ceci <a href="http://news.php.net/php.internals/65496">devrait être mergé</a> sur la branche de PHP 5.5 dans les prochains jours.</li> <li>ALeX Kazik <a href="http://news.php.net/php.internals/65021">a parlé</a> d’un patch qu’il a écrit pour <a href="https://bugs.php.net/bug.php?id=60524">permettre de spécifier le répertoire temporaire depuis <code>php.ini</code></a> ; cet modification semble appréciée, et il y a de bonnes chances pour qu’elle soit appliquée prochainement, ajoutant une nouvelle directive nommée <code>sys_temp_dir</code>.</li> <li>“PHP 6” commence à <a href="http://news.php.net/php.internals/64654">être évoqué</a> pour de futures modifications ;-)</li> <li>Stas Malyshev <a href="http://news.php.net/php.internals/64924">a proposé un correctif</a> pour <a href="https://bugs.php.net/bug.php?id=63462">Bug #63462: Magic methods called twice for unset protected properties</a> </li> <li>Et pour fini, Nikita Nefedov a lancé une discussion sur une éventuelle <a href="http://news.php.net/php.internals/64541">intégration des symboles de Ruby</a> ; qui n’a pas rencontré suffisament d’intérêt pour aller plus loin.</li> </ul> <p><br></p> <hr> <p><strong><code>internals@lists.php.net</code></strong> est la <strong>mailing-list des développeurs de PHP</strong> ; elle est utilisée pour discuter des prochaines évolutions du langage, ainsi que pour échanger autour de suggestions d’améliorations ou de rapports de bugs. <br>Elle est publique, et tout le monde peut s’y inscrire depuis la page <a href="http://www.php.net/mailing-lists.php#internals">Mailing Lists</a>, ou consulter ses archives en HTTP depuis <a href="http://news.php.net/php.internals">php.internals</a> ou depuis le serveur de news <a href="news:/php.internals"><code>news://news.php.net/php.internals</code></a>.</p> <p><br></p> <div class="footnotes"> <hr> <ol> <li id="fn:pas-en-avance"> <p>Cet article n’est pas tout à fait en avance — mais une semaine de retard ne devrait pas changer grand chose à son contenu. <a href="#fnref:pas-en-avance">↩</a></p> </li> <li id="fn:beta1-7-fevrier"> <p>Finalement, il semblerait que la <code>beta1</code> de PHP 5.5 n’ait pas été publiée le 7 février comme cela avait initialement été prévu ; je n’ai pas l’impression que cela ait été officiellement annoncé, mais j’imagine que c’est lié aux discussion en cours autour de l’éventuelle intégration de Zend Optimizer+ à PHP, qui pourrait décaler le planning de sortie de PHP 5.5. <a href="#fnref:beta1-7-fevrier">↩</a></p> </li> <li id="fn:traductions"> <p>Les traductions fournies dans cet article sont toutes de moi et peuvent être un peu imprécises ; les citations réelles sont bien entendu les versions en anglais. <br>Je me suis aussi plusieurs fois accordé la liberté de graisser quelques passages qui me semblaient le mériter. <a href="#fnref:traductions">↩</a></p> </li> </ol> </div> http://blog.pascal-martin.fr/post/php-mailing-list-internals-janvier-2013#comment-new-form http://blog.pascal-martin.fr/post/php-mailing-list-internals-janvier-2013#comment-new-form Statistiques de versions de PHP - janvier 2013 http://blog.pascal-martin.fr/post/statistiques-versions-php-2013-01?utm_source=rss2&utm_medium=feed&utm_campaign=statistiques-versions-php-2013-01 http://blog.pascal-martin.fr/post/statistiques-versions-php-2013-01 Mon, 14 Jan 2013 07:00:00 +0100 Pascal MARTIN phpstats <p> </p> <p>Quelques cinq mois après le dernier article de cette série, publié <a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-08">en août 2012</a>, voici un nouvel état des lieux des différentes versions de PHP et de leur utilisation sur Internet — à titre de comparaison, vous voudrez peut-être aussi jeter un coup d’œil à l’article que j’avais publié <a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01">il y a un an, en janvier 2012</a>.</p> <p>Les données présentées dans cet article ont été collectées le <strong>week-end du 12 janvier 2013</strong>. Les versions stables de PHP sont <strong>PHP 5.3.20</strong> et <strong>PHP 5.4.10</strong> qui ont été publiées le <a href="http://php.net/archive/2012.php#id2012-12-20-1">20 décembre 2012</a> ; cela fait <a href="http://blog.pascal-martin.fr/post/php-5.2-plus-supporte-depuis-deux-ans">tout juste deux ans que PHP 5.2 n’est plus supportée</a> ; et la 3ème version alpha de PHP 5.5 a été publiée <a href="http://php.net/archive/2013.php#id2013-01-10-1">il y a quelques jours</a>.</p> <p><strong>Sommaire :</strong></p> <ul> <li><a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2013-01#methode">Quelques mots sur la méthode</a></li> <li> <a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2013-01#quelques-chiffres">Quelques chiffres</a> <ul> <li><a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2013-01#reponses-php">Réponses PHP</a></li> <li><a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2013-01#serveurs-web">Serveurs Web</a></li> </ul> </li> <li><a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2013-01#versions-majeures">Versions majeures de PHP</a></li> <li><a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2013-01#versions-mineures">Versions mineures de PHP</a></li> <li><a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2013-01#versions-releases">Versions releases de PHP 5.x</a></li> <li><a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2013-01#evolution">Evolution</a></li> </ul> <p><br></p> <h2 id="methode">Quelques mots sur la méthode</h2> <p>Pour faire simple<sup id="fnref:methode-copie-colle"><a href="#fn:methode-copie-colle">1</a></sup>, j’ai récupéré une liste de plus de 9.4 millions de noms de domaines, issus principalement :</p> <ul> <li>Du top 1 million d’Alexa <em>(chargé plusieurs fois à quelques semaines/mois d’écart sur l’année et demie écoulée, ce qui donne maintenant nettement plus de 1 million de noms de domaines)</em>,</li> <li>Des liens externes de wikipedia de plusieurs langues <em>(environ 3 millions de noms de domaines)</em>,</li> <li>De l’export mis à disposition par l’Export Open Directory <em>(environ 2 millions de noms de domaines, certains correspondant à des sites un peu anciens et pas vraiment mis à jour)</em>, </li> <li>Et de quelques résultats de recherche google <em>(quelques milliers de noms de domaines)</em>.</li> </ul> <p>Ensuite, pour chacun de ces noms de domaines, j’ai effectué une requête HTTP <code>HEAD</code> sur <code>domaine.tld</code>, en me rabattant sur <code>www.domaine.tld</code> si la première requête échouait.</p> <p>Après cela, je me suis généralement<sup id="fnref:note-entete-version"><a href="#fn:note-entete-version">2</a></sup> basé sur l’en-tête HTTP <code>X-Powered-By</code> renvoyée par le serveur, pour en extraire le nom de logiciel ayant servir à générer la page, ainsi que sa version. <br>Et dans le cas où cette en-tête n’existe pas, ou ne contient pas d’information exploitable, je me suis rabattu sur l’en-tête <code>Server</code>.</p> <p>Pour rappel, et en ne prenant que quelques exemples relativement typiques, les en-têtes HTTP renvoyées par le serveur, dans le cas de pages générées par PHP et sur un serveur exposant la version de PHP utilisée, ressemblent souvent à quelque chose de ce type <em>(pour www.php.net)</em> :</p> <pre><code>Server: Apache/2.2.21 (FreeBSD) mod_ssl/2.2.21 OpenSSL/0.9.8q PHP/5.4.11-dev X-Powered-By: PHP/5.4.11-dev </code></pre> <p>ou <em>(pour drupal.org)</em> :</p> <pre><code>Server: Apache/2.2.3 (CentOS) X-Powered-By: PHP/5.3.16 </code></pre> <p>A partir de là, extraire le numéro de la version de PHP utilisée est une opération relativement aisée…</p> <p><br></p> <h2 id="quelques-chiffres">Quelques chiffres</h2> <h3 id="reponses-php">Réponses PHP</h3> <p>Sur les 8.7 millions de requêtes HTTP effectuées sur les noms de domaines que j’ai testé, environ 26% des réponses ont été identifiées comme générées par du PHP.</p> <p>Plus précisément, j’ai identifié <strong>2,228,529</strong> réponses comme correspondant à du PHP.</p> <p>Avec ce nombre relativement conséquent de réponses, les statistiques présentées plus bas devraient avoir des chances d’être à peu près correctes, ou, tout au moins, de donner des résultats et chiffres relativement proches de la réalité…</p> <p><br></p> <h3 id="serveurs-web">Serveurs Web</h3> <p>Cela dit, avant d’entrer dans les détails des versions de PHP, voici la liste des Serveurs Web les plus fréquemment identifiés lors de ma collecte de données :</p> <ul> <li><strong>Apache : 5,164,189 — 66.07%</strong></li> <li>IIS : 1,377,796 — 17.63%</li> <li>nginx : 554,345 — 7.09%</li> <li>Autres : 367,593 — 4.70%</li> <li>GSE : 190,096 — 2.43%</li> <li>LiteSpeed : 63,995 — 0.82%</li> <li>YTS : 55,838 — 0.71%</li> <li>Oversee Turing v1.0.0 : 42,196 — 0.54%</li> </ul> <p>Ou, sous forme d’un graphe :</p> <p><span style="display:block;text-align:center;"><a href="http://blog.pascal-martin.fr/public/statistiques-versions-php/2013-01/serveurs.png"><img alt-src="data:image/gif;base64,R0lGODdhAQABAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAAQABAAAIBAChBQQAOw==" alt="Serveurs Web" class="lazy" src="http://blog.pascal-martin.fr/public/statistiques-versions-php/2013-01/small-serveurs.png" width="448px" height="261px"></a></span></p> <p>On ne constate pas de véritable révolution par rapport aux données collectées <a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-08#serveurs-web">il y a cinq mois</a> ou <a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#serveurs-web">il y a un an</a> :</p> <ul> <li> <a href="http://httpd.apache.org/">Apache</a>, toutes versions confondues, reste encore très loin devant tous les autres, servant <strong>deux tiers des pages interrogées</strong> — mais perd quelque chose comme 1.7 point en un an, </li> <li> <a href="http://www.iis.net/">IIS</a> conserve sa seconde place — en perdant 1 point en un an, </li> <li>Et <a href="http://nginx.org/">nginx</a> est encore en troisième place — <strong>en ayant gagné plus de 1.5 point en un an</strong>.</li> </ul> <p><br></p> <h2 id="versions-majeures">Versions majeures de PHP</h2> <p>Commençons par les versions majeures de PHP, en prenant en compte les résultats qui ont été identifiés comme correspondant à une version supérieure ou égale à 3, et inférieure ou égale à 6<sup id="fnref:note-exclusion-versions-abherrantes"><a href="#fn:note-exclusion-versions-abherrantes">3</a></sup>.</p> <p>Mes tests ont remonté le nombre suivant de domaines sur chaque version majeure de PHP :</p> <ul> <li>PHP 3 : 648 — 0.03%</li> <li>PHP 4 : 191,521 — 8.59%</li> <li><strong>PHP 5 : 2,036,247 — 91.38%</strong></li> <li>PHP 6 : 17 — 0.00%</li> </ul> <p>Sous forme d’un graphe, qui peut être plus parlant pour certains et permet de voir en un clin d’œil quelle est la version majeure de PHP la plus répandue, cela donne :</p> <p><span style="display:block;text-align:center;"><a href="http://blog.pascal-martin.fr/public/statistiques-versions-php/2013-01/version-1.png"><img alt-src="data:image/gif;base64,R0lGODdhAQABAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAAQABAAAIBAChBQQAOw==" alt="Versions majeures de PHP" class="lazy" src="http://blog.pascal-martin.fr/public/statistiques-versions-php/2013-01/small-version-1.png" width="448px" height="261px"></a></span></p> <p>On notera :</p> <ul> <li>Que, fort heureusement, <strong>PHP 5 est la version majeure la plus répandue</strong> ; <strong>PHP 5 passe d’ailleurs pour la première fois au-dessus des 90%</strong>,</li> <li>Mais que, début 2013, on a encore quelques centaines de sites, sur 8.7 millions, qui tournent encore sur du <strong>PHP 3</strong>,</li> <li>Et aussi que <strong>PHP 4</strong> est encore vraiment trop répandue, alors que cela fait des années que cette version n’est plus du tout maintenue <em>(PHP 4.4.9, publiée en <a href="http://www.php.net/archive/2008.php#id2008-08-07-1">Août 2008</a>, était annoncée comme étant la dernière version de PHP 4.x)</em>,</li> <li>Et enfin que, bientôt trois ans après <a href="http://blog.mageekbox.net/?post/2010/03/25/Mort-de-PHP6-10-jours">la mise à mort de la branche <strong>PHP 6</strong></a> <em>(qui, pour rappel, n’a jamais vu une version ne serait-ce qu’alpha être publiée)</em>, on rencontre <em>(encore)</em> des sites qui utilisent PHP 6 en production ???</li> </ul> <p><br></p> <h2 id="versions-mineures">Versions mineures de PHP</h2> <p>Si on passe aux versions mineures de PHP, toujours pour PHP &gt;= <code>3.x</code> et PHP &lt;= <code>6.x</code>, et en ne conservant que les versions qui sont remontées 10 fois ou plus, on obtient les données suivantes :</p> <ul> <li>PHP 3.0 : 646 — 0.03%</li> <li>PHP 4.0 : 1,469 — 0.07%</li> <li>PHP 4.1 : 3,434 — 0.15%</li> <li>PHP 4.2 : 3,133 — 0.14%</li> <li>PHP 4.3 : 40,804 — 1.83%</li> <li>PHP 4.4 : 142,681 — 6.40%</li> <li>PHP 5.0 : 5,085 — 0.23%</li> <li>PHP 5.1 : 69,958 — 3.14%</li> <li><strong>PHP 5.2 : 1,014,151 — 45.51%</strong></li> <li><strong>PHP 5.3 : 910,630 — 40.86%</strong></li> <li>PHP 5.4 : 36,410 — 1.63%</li> <li>PHP 6.0 : 17 — 0.00%</li> </ul> <p>Et sous forme graphique :</p> <p><span style="display:block;text-align:center;"><a href="http://blog.pascal-martin.fr/public/statistiques-versions-php/2013-01/version-2.png"><img alt-src="data:image/gif;base64,R0lGODdhAQABAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAAQABAAAIBAChBQQAOw==" alt="Versions mineures de PHP" class="lazy" src="http://blog.pascal-martin.fr/public/statistiques-versions-php/2013-01/small-version-2.png" width="448px" height="261px"></a></span></p> <p>Pour résumer :</p> <ul> <li>PHP 5.2, qui a <a href="http://www.php.net/archive/2010.php#id2010-12-16-1">atteint sa fin de vie en décembre 2010</a>, il y a deux ans, est encore la version de PHP qui semble aujourd’hui la plus utilisée / répandue — mais les choses vont dans le bon sens, puisque <strong>PHP 5.2 est pour la première fois passée sous la barre des 50% !</strong> <em>(<a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-08#versions-mineures">51.42% en août 2012</a>, et <a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-01#versions-mineures">62.35% en janvier 2012</a>)</em> </li> <li> <strong>PHP 5.3</strong>, <a href="http://www.php.net/archive/2009.php#id2009-06-30-1">stable depuis juin 2009</a>, soit trois ans et demi, n’arrive toujours qu’en seconde place — mais continue à se rapprocher de la première, et va probablement bientôt l’atteindre,</li> <li> <strong>PHP 5.4</strong>, dont la première version stable a été publiée le <a href="http://www.php.net/archive/2012.php#id2012-03-01-1">1er mars 2012</a>, monte tout doucement en puissance, puisqu’elle ne représente que 1.63% des installations comptabilisées.</li> <li>Pour la petite histoire : cela ne se voit pas ici, mais j’ai identifié 8 serveurs en PHP 5.5.0 <em>(un en <code>-alpha1</code>, un en <code>-alpha3</code>, et les autres en <code>-dev</code>)</em> </li> </ul> <p>On peut donc dire que <strong>PHP 5.3 s’est enfin imposée !</strong></p> <p>Pas trop tôt devrais-je dire, puisqu’<strong>il est fort probable que PHP 5.3 atteigne bientôt sa fin de vie</strong> — peut-être au moment de la sortie de PHP 5.5, qui pourrait avoir lieu au printemps… Autrement dit, si, en 2013, vous êtes encore avec une version &lt;= 5.2, il n’est plus temps de passer à PHP 5.3, mais bel et bien à 5.4 ;-)</p> <p>Et il peut aussi être temps de commencer à vous pencher sur <a href="http://blog.pascal-martin.fr/tag/php-5.5">PHP 5.5, qui propose plein de nouveautés intéressantes</a>, et est actuellement en phase de versions alpha.</p> <p><br></p> <h2 id="versions-releases">Versions releases de PHP</h2> <p>Et enfin, si on descend au niveau des versions release de <code>PHP 5.x</code><sup id="fnref:note-versions-releases-php5-uniquement"><a href="#fn:note-versions-releases-php5-uniquement">4</a></sup>, en ne conservant que les versions qui remontées 100 fois ou plus, on obtient les données suivantes :</p> <ul> <li>Pour <strong>PHP 5.0</strong> : <ul> <li>5.0.1 : 107 — 0.01%</li> <li>5.0.2 : 236 — 0.01%</li> <li>5.0.3 : 527 — 0.03%</li> <li>5.0.4 : 3,428 — 0.17%</li> <li>5.0.5 : 763 — 0.04%</li> </ul> </li> <li>Pour <strong>PHP 5.1</strong> : <ul> <li>5.1.1 : 265 — 0.01%</li> <li>5.1.2 : 4,486 — 0.22%</li> <li>5.1.3 : 1,601 — 0.08%</li> <li>5.1.4 : 1,785 — 0.09%</li> <li>5.1.5 : 204 — 0.01%</li> <li><strong>5.1.6 : 61,603 — 3.03%</strong></li> </ul> </li> <li>Pour <strong>PHP 5.2</strong> : <ul> <li>5.2.0 : 16,866 — 0.83%</li> <li>5.2.1 : 4,587 — 0.23%</li> <li>5.2.2 : 1,313 — 0.06%</li> <li>5.2.3 : 5,774 — 0.28%</li> <li>5.2.4 : 34,101 — 1.67%</li> <li>5.2.5 : 25,145 — 1.23%</li> <li><strong>5.2.6 : 124,980 — 6.14%</strong></li> <li>5.2.7 : 184 — 0.01%</li> <li>5.2.8 : 17,303 — 0.85%</li> <li>5.2.9 : 54,962 — 2.70%</li> <li>5.2.10 : 33,994 — 1.67%</li> <li>5.2.11 : 21,099 — 1.04%</li> <li>5.2.12 : 28,176 — 1.38%</li> <li>5.2.13 : 31,587 — 1.55%</li> <li>5.2.14 : 36,442 — 1.79%</li> <li>5.2.15 : 3,137 — 0.15%</li> <li>5.2.16 : 11,545 — 0.57%</li> <li><strong>5.2.17 : 562,822 — 27.64%</strong></li> <li>5.2.18<sup id="fnref:note-5.2.18"><a href="#fn:note-5.2.18">5</a></sup> : 113 — 0.01%</li> </ul> </li> <li>Pour <strong>PHP 5.3</strong> : <ul> <li>5.3.0 : 2,522 — 0.12%</li> <li>5.3.1 : 3,310 — 0.16%</li> <li>5.3.2 : 52,101 — 2.56%</li> <li><strong>5.3.3 : 208,429 — 10.24%</strong></li> <li>5.3.4 : 3,574 — 0.18%</li> <li>5.3.5 : 24,212 — 1.19%</li> <li>5.3.6 : 78,797 — 3.87%</li> <li>5.3.7 : 590 — 0.03%</li> <li>5.3.8 : 57,818 — 2.84%</li> <li>5.3.9 : 8,071 — 0.40%</li> <li><strong>5.3.10 : 89,158 — 4.38%</strong></li> <li>5.3.11 : 904 — 0.04%</li> <li>5.3.12 : 552 — 0.03%</li> <li>5.3.13 : 33,792 — 1.66%</li> <li>5.3.14 : 21,402 — 1.05%</li> <li>5.3.15 : 50,011 — 2.46%</li> <li>5.3.16 : 32,741 — 1.61%</li> <li>5.3.17 : 34,282 — 1.68%</li> <li>5.3.18 : 115,808 — 5.69%</li> <li>5.3.19 : 56,717 — 2.79%</li> <li>5.3.20 : 35,831 — 1.76%</li> </ul> </li> <li>Pour <strong>PHP 5.4</strong> : <ul> <li>5.4.0 : 983 — 0.05%</li> <li>5.4.1 : 140 — 0.01%</li> <li>5.4.3 : 1,452 — 0.07%</li> <li>5.4.4 : 4,115 — 0.20%</li> <li>5.4.5 : 1,413 — 0.07%</li> <li>5.4.6 : 3,749 — 0.18%</li> <li>5.4.7 : 3,832 — 0.19%</li> <li>5.4.8 : 3,340 — 0.16%</li> <li>5.4.9 : 5,914 — 0.29%</li> <li><strong>5.4.10 : 11,384 — 0.56%</strong></li> </ul> </li> </ul> <p>Et sous forme graphique :</p> <p><span style="display:block;text-align:center;"><a href="http://blog.pascal-martin.fr/public/statistiques-versions-php/2013-01/version-3-5.x.png"><img alt-src="data:image/gif;base64,R0lGODdhAQABAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAAQABAAAIBAChBQQAOw==" alt="Versions releases de PHP" class="lazy" src="http://blog.pascal-martin.fr/public/statistiques-versions-php/2013-01/small-version-3-5.x.png" width="448px" height="224px"></a></span></p> <p>Pour résumer :</p> <ul> <li>Toujours une quantité non-négligeable <em>(3.03%)</em> de sites sous PHP <strong>5.1.6</strong> <em>(qui a été publiée en <a href="http://www.php.net/archive/2006.php">Août 2006</a>)</em> ; la version fournie par défaut sous certaines distributions, il me semble, genre Redhat Enterprise.</li> <li>Beaucoup de <strong>PHP 5.2.6</strong> <em>(6.14%)</em> <em>(publiée en <a href="http://www.php.net/archive/2008.php#id2008-05-01-1">Mai 2008</a>)</em> ; la version fournie par défaut sous Debian Lenny, par exemple.</li> <li>La version de PHP la plus répandue est PHP <strong>5.2.17</strong> <em>(publiée en <a href="http://www.php.net/archive/2011.php#id2011-01-06-1">Janvier 2011</a>)</em>, avec 27.64% ; ça reste du 5.2, qui a atteint sa <em>fin de vie</em>, mais positivons, en se disant que c’est la dernière version, la plus à jour…</li> <li>Et enfin, plusieurs sous versions de <strong>PHP 5.3.x</strong>, sans qu’aucune ne s’impose vraiment ; entre autres : <ul> <li>PHP 5.3.3, qui est la version 5.3.x la plus représentée avec 10.24% — la version par défaut sous Debian Squeeze, notamment, </li> <li>PHP 5.3.10 <em>(4.38%)</em> — version par défaut sous Ubuntu 12.04 <em>(qui est une LTS — dommage, les 6 versions de retard)</em>, par exemple.</li> </ul> </li> </ul> <p>Pour PHP 5.3 et 5.4, hormis les versions fournies par quelques grandes distributions, on constate qu’aucune version ne s’impose réellement, et que toutes se partagent une petite part des serveurs installés ; si je devais me risquer à une interprétation, je dirais que les hébergeurs ont du mal à suivre le rythme de publication des mises à jour, qui tourne depuis quelques temps à une nouvelle version par mois <em>(l’idée étant, bien entendu, de publier plus rapidement les corrections de bugs)</em>.</p> <p><br></p> <h2 id="evolution">Evolution</h2> <p>Je ne ferai pas une longue analyse sur le pourquoi du comment des chiffres que j’ai présenté ici : libre à vous de commenter sur le trop grand usage de versions complètement obsolètes, et le manque de mise à jour que l’on peut, malheureusement, trop souvent constater…</p> <p>Cela dit, puisque ce n’est pas la première fois que j’effectue ce processus de collecte de statistiques à propos des versions de PHP utilisées, je me suis dit qu’il pouvait être intéressant de tracer un graphe représentant l’évolution de ces utilisations.</p> <p>Le graphe reproduit ci-dessous présente donc l’évolution de l’utilisation des versions mineures de PHP, depuis septembre 2011<sup id="fnref:note-evolution-pourcentages"><a href="#fn:note-evolution-pourcentages">6</a></sup> :</p> <p><span style="display:block;text-align:center;"><a href="http://blog.pascal-martin.fr/public/statistiques-versions-php/2013-01/evolution.png"><img alt-src="data:image/gif;base64,R0lGODdhAQABAOcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAAAQABAAAIBAChBQQAOw==" alt="Evolution de l'utilisation des versions (mineures) de PHP" class="lazy" src="http://blog.pascal-martin.fr/public/statistiques-versions-php/2013-01/small-evolution.png" width="448px" height="198px"></a></span></p> <p>J’ai essayé de mettre en évidence les versions les plus à même de nous concerner en ce moment <em>(à savoir, PHP 5.2, 5.3, et 5.4)</em>, ainsi que, dans une moindre mesure les deux autres versions les plus utilisées <em>(autrement dit, PHP 4.4 et 5.1)</em>.</p> <p>Je disais dès <a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-04#evolution">avril 2012</a> que PHP 5.2 laissait petit à petit sa place à PHP 5.3, et en <a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-08#evolution">août 2012</a> que c’était encore plus visible quelques mois plus tard… Nous en sommes désormais au point où <strong>PHP 5.3 a quasiment rattrapé PHP 5.2<sup id="fnref:php-5.2-vs-5.3"><a href="#fn:php-5.2-vs-5.3">7</a></sup> !</strong></p> <p>Maintenant, à nous de faire en sorte que PHP 5.4 soit adopté plus rapidement que PHP 5.3 ne l’a été — PHP 5.3 semblant être sur le point d’atteindre sa fin de vie, et la migration 5.3 -&gt; 5.4 représentant un pas moins important que celui séparant PHP 5.2 de 5.3.</p> <p><br></p> <div class="footnotes"> <hr> <ol> <li id="fn:methode-copie-colle"> <p>Oui, il y a beaucoup de copier-coller d’article en article, pour cette section “méthode” : elle ne change pas d’une fois à l’autre. <a href="#fnref:methode-copie-colle">↩</a></p> </li> <li id="fn:note-entete-version"> <p>Pour certains types de serveurs ou de logiciels, j’ai mis en place un bout de code qui va chercher les informations de version dans d’autres en-têtes que <code>X-Powered-By</code>. Par exemple, pour les sites développés en ASP.NET, les informations de version figurent généralement dans une en-tête nommée <code>X-AspNet-Version</code>. <a href="#fnref:note-entete-version">↩</a></p> </li> <li id="fn:note-exclusion-versions-abherrantes"> <p>Pour ne pas prendre en compte les quelques résultats abherrant qu’on aurait pu relever. <a href="#fnref:note-exclusion-versions-abherrantes">↩</a></p> </li> <li id="fn:note-versions-releases-php5-uniquement"> <p>PHP 4 correspondant à des versions tellement dépassées que je préfére ne pas prendre la peine de rentrer au niveau des versions release. <a href="#fnref:note-versions-releases-php5-uniquement">↩</a></p> </li> <li id="fn:note-5.2.18"> <p>Oui, j’ai trouvé des serveurs indiquant qu’ils utilisaient une version 5.2.18 de PHP — alors qu’il n’existe pas “officiellement” de version 5.2.18. <br>En pratique, la version indiquée est généralement <code>PHP/5.2.18-dev</code> <em>(sur snowfactory.fi par exemple ; ce suffixe <code>-dev</code> correspond typiquement à un build depuis les sources de la branche 5.2 de PHP)</em>, ou <code>PHP/5.2.18-edong</code> <em>(sur damophoto.com par exemple ; pour ce suffixe <code>-edong</code>, aucune idée de son origine ; je ne me rappelle pas l’avoir vu auparavant — possiblement un hébergeur qui fait ses propres build de PHP ?)</em> <a href="#fnref:note-5.2.18">↩</a></p> </li> <li id="fn:note-evolution-pourcentages"> <p>Les chiffres présentés sur le graphique d’évolution sont en pourcentages, afin d’être indépendants du nombre d’hôtes interrogés, qui varie à chaque série de collectes. <a href="#fnref:note-evolution-pourcentages">↩</a></p> </li> <li id="fn:php-5.2-vs-5.3"> <p>J’ai bon espoir de pouvoir annoncer, la prochaine fois où je publierai un article de cette série, que PHP 5.3 aura dépassé PHP 5.2, et sera alors en première place ;-) <a href="#fnref:php-5.2-vs-5.3">↩</a></p> </li> </ol> </div> http://blog.pascal-martin.fr/post/statistiques-versions-php-2013-01#comment-new-form http://blog.pascal-martin.fr/post/statistiques-versions-php-2013-01#comment-new-form PHP 5.2 n'est plus supportée depuis deux ans ! http://blog.pascal-martin.fr/post/php-5.2-plus-supporte-depuis-deux-ans?utm_source=rss2&utm_medium=feed&utm_campaign=php-5.2-plus-supporte-depuis-deux-ans http://blog.pascal-martin.fr/post/php-5.2-plus-supporte-depuis-deux-ans Mon, 07 Jan 2013 07:00:00 +0100 Pascal MARTIN phpphp-5.2 <p> </p> <p>PHP 5.2.16, publiée il y a plus de deux ans, le <a href="http://php.net/archive/2010.php#id2010-12-16-1">16 décembre 2010</a>, était censée être la dernière version de la branche 5.2 <em>(je cite)</em> :</p> <blockquote> <p>This release marks the end of support for PHP 5.2. <br>All users of PHP 5.2 are encouraged to upgrade to PHP 5.3.</p> </blockquote> <p>Et en français :</p> <blockquote> <p>Cette version marque la fin du support pour PHP 5.2. <br>Tous les utilisateurs de PHP 5.2 sont encouragés à mettre à jour vers PHP 5.3.</p> </blockquote> <p>Pour éviter de rester avec un bug critique, elle a été suivie quelques jours après, le <strong><a href="http://php.net/archive/2010.php#id2010-12-16-1">6 janvier 2011</a></strong>, d’une version 5.2.17 — qui a effectivement <strong>marqué la fin des développements pour la branche 5.2 de PHP</strong>, puisqu’aucune autre version n’a été publiée dans les deux années qui ont suivies.</p> <p><br></p> <p>Autrement dit, <strong>cela fait aujourd’hui deux ans que PHP 5.2 n’est plus supportée</strong> : plus la moindre évolution, ce qui est une chose, mais plus non plus de correction de bug, ni même de correction d’éventuelles failles de sécurité !</p> <p><br></p> <p>Donc, si vous êtes encore bloqué à PHP 5.2 <em>(ou même à une version inférieure)</em> deux ans après la fin de son support<sup id="fnref:bloque-php52"><a href="#fn:bloque-php52">1</a></sup>, une bonne résolution pour cette année qui commence pourrait être de <strong>monter de version de PHP</strong> ;-) <br>Par exemple, pour <strong>passer à PHP 5.4</strong>, dont la première version stable a été publiée il y a dix mois, le <a href="http://www.php.net/archive/2012.php#id2012-03-01-1">1er mars 2012</a>.</p> <p>Vous noterez que je <strong>ne vous conseille pas de passer à PHP 5.3</strong> : cette branche, dont la première version stable a été publiée le <a href="http://www.php.net/archive/2009.php#id2009-06-30-1">30 juin 2009</a>, va elle-même probablement bientôt atteindre sa fin de vie<sup id="fnref:eol-php53"><a href="#fn:eol-php53">2</a></sup>.</p> <p>Quelques liens qui vous aideront peut-être à effectuer cette migration :</p> <ul> <li><a href="http://php.net/manual/fr/migration53.php">Migration de PHP 5.2.x vers PHP 5.3.x</a></li> <li>et <a href="http://php.net/manual/fr/migration54.php">migration de PHP 5.3.x à PHP 5.4.x</a>.</li> </ul> <p>Vous pouvez aussi vouloir commencer à vous pencher sur PHP 5.5, actuellement en phase de versions alpha et qui pourrait être publiée en version stable au printemps, avec <a href="http://blog.pascal-martin.fr/tag/php-5.5">la série d’articles que j’ai rédigé sur PHP 5.5</a>, et la page de manuel <a href="http://php.net/manual/fr/migration55.php">migration de PHP 5.4.x à PHP 5.5.x</a>.</p> <p><br></p> <p>A titre d’information, vous pouvez vous reporter à la page <a href="http://php.net/eol.php">unsupported branches</a>, qui liste, pour chaque version de PHP, depuis quand elle n’est plus supportée.</p> <p>Vous ne manquerez d’ailleurs pas de noter le passage suivant <em>(je cite, emphasis mine)</em> :</p> <blockquote> <p>If you are using these releases, you are strongly urged to upgrade to a current version, <br>as <strong>using older versions may expose you to security vulnerabilities and bugs</strong> <br>that have been fixed in more recent versions of PHP.</p> </blockquote> <p>Autrement dit :</p> <blockquote> <p>Si vous utilisez une de ces versions, vous êtes fortement encouragé à mettre à jour vers une version actuelle, <br>car <strong>utiliser des versions plus anciennes peut vous exposer à des failles de sécurité et à des bugs</strong> <br>qui ont été corrigés dans des versions plus récentes de PHP.</p> </blockquote> <p><br></p> <div class="footnotes"> <hr> <ol> <li id="fn:bloque-php52"> <p>Lorsque j’ai publié mes <a href="http://blog.pascal-martin.fr/post/statistiques-versions-php-2012-08">statistiques de versions de PHP en août 2012</a>, PHP 5.2 représentait encore plus de la moitié des versions de PHP détectée ! <br><em>(Je vais essayer de mettre à jour ces statistiques dans les prochaines semaines)</em> <a href="#fnref:bloque-php52">↩</a></p> </li> <li id="fn:eol-php53"> <p>Il y a des chances de l’EOL <em>(End Of Life — Fin De Vie)</em> de PHP 5.3 soit annoncée au moment de la sortie de PHP 5.5, pour éviter d’avoir trois versions de PHP à maintenir. <a href="#fnref:eol-php53">↩</a></p> </li> </ol> </div> http://blog.pascal-martin.fr/post/php-5.2-plus-supporte-depuis-deux-ans#comment-new-form http://blog.pascal-martin.fr/post/php-5.2-plus-supporte-depuis-deux-ans#comment-new-form Ce mois-ci sur internals@php - Décembre 2012 http://blog.pascal-martin.fr/post/php-mailing-list-internals-decembre-2012?utm_source=rss2&utm_medium=feed&utm_campaign=php-mailing-list-internals-decembre-2012 http://blog.pascal-martin.fr/post/php-mailing-list-internals-decembre-2012 Tue, 01 Jan 2013 23:00:00 +0100 Pascal MARTIN phpinternals@ <p> </p> <p>Pour commencer ce récapitulatif de ce qui m’a semblé être les principaux événements et sujets de discussions sur la <strong>mailing-list <code>internals@</code></strong> en ce mois de <strong>décembre 2012</strong>, David Soria Parra et Julien Pauli, Release Managers de PHP 5.5, annoncent <strong><a href="http://news.php.net/php.internals/64265">un planning de sortie pour PHP 5.5</a></strong>.</p> <ul> <li>Cela commence par une seconde alpha mi-décembre, un mois après la première, <em>(cette version alpha2 a été publiée le <a href="http://php.net/archive/2012.php#id2012-12-21-1">21 décembre</a>)</em> </li> <li>Viendront probablement ensuite une alpha3 <em>(qui aurait pu sortir fin décembre ; ça sera plutôt probablement pour début janvier)</em> et peut-être une alpha4 <em>(mi-janvier ?)</em>, </li> <li>Qui seront suivies de probablement deux versions beta, <strong>la phase de beta marquant la fin de l’ajout/modification de fonctionnalités</strong> <em>(“feature-freeze”)</em>.</li> </ul> <p>Suite à cet enchainement de versions alpha et beta, on peut s’attendre à plusieurs versions RC — ce qui ménerait à une sortie de PHP 5.5.0 pour les environs d’avril 2013 <em>(soit un peu plus d’un an après la sortie de PHP 5.4)</em>.</p> <p><br></p> <p>Plus ou moins en parallèle, Johannes Schlüter lance le sujet de la <strong><a href="http://news.php.net/php.internals/64214">fin de vie de PHP 5.3</a></strong>, PHP 5.3.0 étant sortie en <a href="http://www.php.net/archive/2009.php#id2009-06-30-1">juin 2009</a>, et PHP 5.4.0 ayant été publiée en <a href="http://www.php.net/archive/2012.php#id2012-03-01-1">mars 2012</a>.</p> <p>La difficulté majeure qui va se poser est la lenteur d’adoption de PHP 5.4 par les distributions Linux ; en particulier par les distributions orientées “entreprise” <em>(RHEL 6.3 n’en n’est qu’à PHP 5.3.3)</em>, qui sont très longues à adopter de nouvelles versions, ou par les distributions “LTS”.</p> <p>Le plus gros des problèmes posés par <a href="http://pecl.php.net/package/apc">APC</a> en combinaison avec PHP 5.4, qui ont longtemps empéché/retardé la migration d’un nombre non-négligeable de serveurs/applications devraient être réglés : au maximum, il doit rester des bugs déjà présents avec PHP 5.3 ; en citant <a href="http://news.php.net/php.internals/64241">Rasmus Lerdorf</a> :</p> <blockquote> <p>APC is at the point now for 5.4 where I don’t think there are any more <br>edge cases than we have in 5.3. Neither is perfect, but it is close <br>enough for the majority of sites.</p> </blockquote> <p>Notons aussi que “EOL” ne veut pas dire que PHP 5.3 cessera de fonctionner ; et cette version continuera probablement à recevoir des correctifs pour les bugs critiques pendant quelques temps <em>(un an ?)</em>.</p> <p>Je n’ai pas le sentimentant qu’un concensus ait réellement été atteint ; cela dit, <strong>plusieurs développeurs souhaitent que PHP 5.3 soit annoncé comme atteignant son EOL lors de la sortie de PHP 5.5</strong>, pour ne pas avoir trois versions à maintenir en parallèle <em>(PHP 5.3, PHP 5.4, et PHP 5.5)</em> — et leur argument est somme toute rationnel : autant concentrer les efforts sur le développement de nouvelles fonctionnalités et d’améliorations pour les futures versions du langage, plutôt que de continuer à travailler éternellement sur des versions datant de plusieurs années.</p> <p><br></p> <p>Suite à <a href="https://wiki.php.net/rfc/mysql_deprecation">la RFC</a> et au vote dont je parlais <a href="http://blog.pascal-martin.fr/post/php-mailing-list-internals-novembre-2012">le mois dernier</a>, <strong>l’extension <a href="http://news.php.net/php.internals/64191"><code>ext/mysql</code> sera marquée comme <em>dépréciée</em> dès PHP 5.5</a></strong>.</p> <p>Cela fait plusieurs années que <code>ext/mysql</code> n’est plus “la” solution qui devrait être utilisée pour interroger une base de données MySQL à partir de PHP, mais un rappel ne peut pas faire de mal ; n’hésitez donc pas à communiquer sur ce point : nous devrions tous utiliser <code>ext/mysqli</code> ou <code>PDO</code>.</p> <p><br></p> <p>Comme le fait remarquer Nikita Nefedov depuis son mail <a href="http://news.php.net/php.internals/64232">DateTime improvement</a>, de nombreux développeurs ont tendance à traiter un objet <code>DateTime</code> comme étant variable <em>(“mutable”, en anglais)</em>, ce qui, techniquement, est le cas ; alors qu’une date est, par nature, immuable <em>(“immutable en anglais”)</em><sup id="fnref:mutable-object"><a href="#fn:mutable-object">1</a></sup>.</p> <p>En l’état actuel des choses, une classe <code>DateTimeImmutable</code> a été implémentée, correspondant à une date immuable ; cette fonctionnalité n’a pas encore été mergée, et n’est pour l’instant disponible que sur la branche Git <a href="http://git.php.net/?p=php-src.git;a=shortlog;h=refs/heads/immutable-date"><code>immutable-date</code></a><sup id="fnref:note-process-datetime"><a href="#fn:note-process-datetime">2</a></sup>.</p> <p><br></p> <p>Quelques mois après l’ajout des <a href="http://blog.pascal-martin.fr/post/php-5.5-generators">Generators</a> à PHP 5.5, Nikita Popov propose de leur <a href="http://news.php.net/php.internals/64325">ajouter une méthode <code>throw()</code></a> — que l’on peut déjà trouver en Python ou en ECMAScript.</p> <p>Cette proposition n’ayant pas rencontré d’opposition, elle <a href="https://github.com/php/php-src/commit/be7b0bc3ec02e4f223920ee6397f9c4993eb7df5">a été commitée</a> pour PHP 5.5.</p> <p><br></p> <p>Lars Strojny note que <strong>le PHP Core</strong> <em>(les développeurs de PHP en lui-même)</em> <strong>n’a pas une voix au sein du <a href="http://www.php-fig.org/">PHP FIG</a></strong> <em>(Framework Interoperability Group)</em>, et que c’est quelque chose qu’il pourrait être intéressant de changer : <a href="http://news.php.net/php.internals/64291">Core liason for PHP FIG</a>.</p> <p>Dans les grandes lignes <em>(en dehors des écarts sur le rôle du FIG, sur sa légitimité à représenter “tout le monde”, sur le fait qu’il ne constitue pas une autorité universellement reconnue, ou sur l’indentation à 2-4 espaces ou tabulations)</em>, le sentiment global est que le PHP Core n’a pas vraiment à influencer la manière dont les applications en PHP sont écrites <em>(en particulier, pour les normes de codages, puisque PHP est écrit en C — alors que les applications PHP, elles, sont écrites, de toute évidence, en PHP)</em>.</p> <p>En fait, comme le souligne <a href="http://news.php.net/php.internals/64294">Pierre Joye</a>, il serait peut-être bon que l’inverse se produise, et que plus de développeurs travaillant sur les différentes applications et frameworks développés en PHP s’impliquent sur le développement de PHP en lui-même ; cela aiderait sans aucun doute à synchroniser les besoins des uns avec l’orientation que prend le langage PHP.</p> <p><br></p> <p>Pierrick Charron a lancé une <a href="http://news.php.net/php.internals/64351">discussion autour d’<code>ext/curl</code></a>, suite au changement de comportement de l’option <code>CURLOPT_SSL_VERIFYHOST</code> de <code>libcurl</code> <em>(la bibliothèque que <code>ext/curl</code> expose à PHP)</em> : la valeur <code>1</code> n’est plus disponible pour cette option.</p> <p>En fonction de la version de <code>libcurl</code> utilisée par PHP, désormais, passer la valeur <code>1</code> pour l’option <code>CURLOPT_SSL_VERIFYHOST</code> entrainera la levée d’une notice, indiquant :</p> <ul> <li>soit que valeur est obsolète, et ne sera bientôt plus supportée, </li> <li>soit que cette valeur n’est plus supportée, et que <code>2</code> sera utilisée à la place.</li> </ul> <p>Donc, potentiellement, il se peut que vous ayiez du code à corriger <em>(et ce dès PHP 5.3)</em> — en particulier si vous aviez considéré que cette option attendait un booléen.</p> <p><br></p> <p>Andrey Andreev propose que les fonctions de manipulation de cookies envoient l’attribut <code>Max-Age</code> dans l’en-tête HTTP <code>Set-Cookie</code>, pour spécifier la durée de vie du cookie, à partir de l’instant présent : <a href="http://news.php.net/php.internals/64223">Bug #23955: Cookie Max-Age attribute</a>.</p> <p>Quelques jours après, il a rédigé la RFC correspondante : <a href="https://wiki.php.net/rfc/cookie_max-age">RFC: Cookie Max-Age attribute</a>.</p> <p>Les quelques retours <em>(encore peu nombreux, la RFC ayant été rédigée à la toute fin du mois)</em> postés jusqu’à présent ont l’air plutôt positifs.</p> <p><br></p> <p>Victor Berchet <a href="http://news.php.net/php.internals/64342">propose que plus de structures de données soient implémentée dans PHP</a>. La conversation s’est un peu essoufflée avec la fin d’année ; mais elle a tout de même eu le temps de s’orienter vers la Spl et des différentes classes que celle-ci propose ; classes qui, pour certaines, <a href="http://news.php.net/php.internals/64346">gagneraient à être retravaillées</a>, d’ailleurs.</p> <p><br></p> <p>Yussuf Khalil propose d’<a href="http://news.php.net/php.internals/64435">ajouter un modificateur <code>deprecated</code> pour les fonctions et méthodes</a>, et a rédigé la RFC correspondante : <a href="https://wiki.php.net/rfc/deprecated-modifier">RFC: Add a deprecated modifier for functions</a>.</p> <p>L’idée est que les développeurs d’une bibliothèque ou d’un framework PHP puissent indiquer facilement <em>(et que ce soit exporté via l’API de Reflection, comme c’est le cas pour les fonctions internes à PHP)</em> qu’une fonction/méthode est obsolète, et sera retirée dans une prochaine version.</p> <p>Dans l’ensemble, les retours sont plutôt opposés à cette proposition, considérant qu’il est difficile/risqué d’ajouter un nouveau modificateur, et qu’appeler <code>trigger_error()</code> au début d’une fonction en levant un avertissement de niveau <code>E_DEPRECATED</code>, tout en ajoutant un tag <code>@deprecated</code> à la phpdoc <em>(pour les IDE notamment)</em>, n’est pas une opération complexe pour le développeur de la bibliothèque et permet d’indiquer un message plus précis <em>(comportant par exemple un pointeur vers la solution à utiliser en remplacement)</em>.</p> <p><br></p> <p>Bien sûr, comme chaque mois, nous avons droit à quelques correctifs de bugs <em>(par exemple, <a href="https://bugs.php.net/bug.php?id=52752">Bug #52752 : Crash when lexing</a>)</em>, ainsi qu’à des améliorations orientées performances ; par exemple pour la <a href="http://news.php.net/php.internals/64127">fonction <code>date()</code></a>, ou avec le sujet <a href="http://news.php.net/php.internals/64120"><code>execute_data-&gt;Ts</code> removing</a>.</p> <p>En parallène, Dmitry Stogov a commencé à travailler sur une <a href="http://news.php.net/php.internals/64335">refonte de l’implémentation des Traits</a>, l’implémentation courante n’étant pas optimale et se détériorant à chaque correctif, rendant plus difficile la mise en place des suivants. En fonction des retours, ces améliorations pourraient être commitées sur la branche PHP 5.4 dans les prochaines semaines.</p> <p><br></p> <p>Et pour finir sur une note qui serait presque comique <em>(si ce n’était pas en même temps assez triste…)</em>, un post de Lester Caine qui note que <a href="http://news.php.net/php.internals/64143">les choses bougent lentement dans le monde réel ;)</a>.</p> <p>En l’occurence, l’hébergeur 1&amp;1 annonce la fin du support de PHP 4 et de PHP 5.2 pour le 1er avril 2013 — ce qui signifie, oui, qu’ils supportent encore PHP 4 !</p> <p>Mais aussi, et c’est encore plus surprenant, leur <a href="http://faq.1and1.co.uk/scripting/php/5.html">FAQ</a> annonce <em>(je cite)</em> :</p> <blockquote> <p>To parse a script as PHP 5.4, simply name the script with the file extension <strong>.php6</strong></p> </blockquote> <p>Autrement dit :</p> <blockquote> <p>Pour qu’un script soit interprété comme du PHP 5.4, il suffit de nommer le fichier avec l’extension <strong>.php6</strong>.</p> </blockquote> <p>Arrivés fin 2012 / début 2013, considérant l’histoire de PHP 6, ça laisse songeur, n’est-ce pas ?</p> <p><br></p> <hr> <p><strong><code>internals@lists.php.net</code></strong> est la <strong>mailing-list des développeurs de PHP</strong> ; elle est utilisée pour discuter des prochaines évolutions du langage, ainsi que pour échanger autour de suggestions d’améliorations ou de rapports de bugs. <br>Elle est publique, et tout le monde peut s’y inscrire depuis la page <a href="http://www.php.net/mailing-lists.php#internals">Mailing Lists</a>, ou consulter ses archives en HTTP depuis <a href="http://news.php.net/php.internals">php.internals</a> ou depuis le serveur de news <a href="news:/php.internals"><code>news://news.php.net/php.internals</code></a>.</p> <p><br></p> <div class="footnotes"> <hr> <ol> <li id="fn:mutable-object"> <p>Pour plus d’informations sur les objets variables / immuables, vous pouvez consulter :</p> <ul> <li> <a href="http://fr.wikipedia.org/wiki/Objet_immuable">Objet immuable</a> en français, </li> <li>ou <a href="http://en.wikipedia.org/wiki/Immutable_object">Immutable object</a> en anglais, </li> <li>ou encore <a href="http://www.ibm.com/developerworks/java/library/j-jtp02183/index.html">Java theory and practice: To mutate or not to mutate?</a>.</li> </ul> <p><a href="#fnref:mutable-object">↩</a></p> </li> <li id="fn:note-process-datetime"> <p>Comme <a href="http://news.php.net/php.internals/64372">le souligne</a> Pierre Joye, il aurait été intéressant de respecter les processus mis en place, et de rédiger une RFC avant de commencer à implémenter cette nouvelle classe <code>DateTimeImmuable</code> sur le repository Git de PHP — même si elle s’est faite sur une branche séparée… <a href="#fnref:note-process-datetime">↩</a></p> </li> </ol> </div> http://blog.pascal-martin.fr/post/php-mailing-list-internals-decembre-2012#comment-new-form http://blog.pascal-martin.fr/post/php-mailing-list-internals-decembre-2012#comment-new-form Ce mois-ci sur internals@php - Novembre 2012 http://blog.pascal-martin.fr/post/php-mailing-list-internals-novembre-2012?utm_source=rss2&utm_medium=feed&utm_campaign=php-mailing-list-internals-novembre-2012 http://blog.pascal-martin.fr/post/php-mailing-list-internals-novembre-2012 Mon, 03 Dec 2012 07:00:00 +0100 Pascal MARTIN internals@php <p> </p> <p>L’événement principal de ce mois de novembre 2012 sur la mailing-list <code>internals@</code> est probablement l’annonce de la <strong>création de la branche 5.5 de PHP</strong>, ainsi que de la sortie de la <strong>première version alpha</strong> :</p> <ul> <li> <a href="http://news.php.net/php.internals/63716">Branching PHP-5.5</a> : le 30 octobre, David Soria Parra annonce que la branche PHP 5.5 va être créée dans les jours qui suivent.</li> <li> <a href="http://news.php.net/php.internals/63848">HEADS UP: PHP-5.5 branched</a> : dans la suite de l’annonce précédente, David Soria Parra annonce le 13 novembre que la branche 5.5 a été créée.</li> <li> <a href="http://news.php.net/php.internals/63880">PHP 5.5.0alpha1 Released for Testing!</a> : et le 15 novembre, voici l’annonce de la sortie de la première version alpha de PHP 5.5.</li> </ul> <p>Ces annonces marquent le début de la phase de release de PHP 5.5, qui va voir s’enchainer versions alpha, bêta, et RC, jusqu’à la sortie de la première version stable — peut-être au printemps ou au début de l’été prochain.</p> <p><br></p> <p>Vient ensuite ce qui a sans aucun doute été <strong>LA</strong> discussion de ce mois, avec 163 mails au moment où j’écris ceci : Adam Harvey <a href="http://news.php.net/php.internals/63803">annonce</a> le 12 novembre qu’il a publié la <a href="https://wiki.php.net/rfc/mysql_deprecation">RFC: ext/mysql deprecation</a>.</p> <p>Dans l’ensemble, les différents intervenants sont d’accord sur le principe que <code>ext/mysql</code> devrait être marquée comme obsolète <em>un jour</em>, et probablement sortie du core et déplacée vers PECL <em>un jour</em>. Cela dit, le gros de la question porte sur <strong>quand</strong> ce marquage en <code>E_DEPRECATED</code> devrait avoir lieu : pour PHP 5.5 ? ou plus tard ?</p> <p>Depuis, les choses ont avancé d’une étape, puisque la RFC est en cours de vote depuis le 28 novembre : <a href="http://news.php.net/php.internals/64065">[VOTE] ext/mysql deprecation in 5.5</a> — ce fil de discussion en est à 40 mails au moment où j’écris ceci, ce qui fait un total de <strong>plus de 200 mails autour de <code>ext/mysql</code></strong> en moins d’un mois ! <br>En l’état actuel, à la question <em>“est-ce que <code>ext/mysql</code> doit générer des erreurs <code>E_DEPRECATED</code> dès PHP 5.5”</em>, <a href="https://wiki.php.net/rfc/mysql_deprecation#voting">21 intervenants ont voté pour, et 12 contre</a>.</p> <p>Pour plus d’informations sur ce sujet, je vous encourage vivement à lire :</p> <ul> <li>Sur ce blog, l’article <a href="http://blog.pascal-martin.fr/post/php-arretez-utiliser-fonctions-mysql">Arrêtez d’utiliser les fonctions mysql_*() !</a>, que j’ai publié il y a une dizaine de jours,</li> <li>Et <a href="http://blog.ulf-wendel.de/2012/php-mysql-why-to-upgrade-extmysql/">Supercharging PHP MySQL applications using the best API</a>.</li> </ul> <p><br></p> <p>Clint Priest poursuit le travail de ces derniers mois autour de l’implémentation d’accesseurs de propriétés :</p> <ul> <li> <a href="https://wiki.php.net/rfc/propertygetsetsyntax-as-implemented">Request for Comments: Property accessors syntax - As Implemented</a> : la RFC décrivant la proposition, </li> <li> <a href="http://news.php.net/php.internals/63963">[RFC] Property Accessors v1.2 Consensus Changes</a> : la suite de la discussion sur <code>internals@</code> ; quoique moins active ce mois-ci.</li> </ul> <p><br></p> <p>Je disais dans l’article <a href="http://blog.pascal-martin.fr/post/php-5.5-bc-breaks">En route vers PHP 5.5 : Quelques backward-compatible breaks</a> que les fonctions <code>php_egg_logo_guid()</code>, <code>php_logo_guid()</code>, et <code>php_real_logo_guid()</code> avaient été supprimées pour PHP 5.5<sup id="fnref:note-suppression-logo"><a href="#fn:note-suppression-logo">1</a></sup>.</p> <p>Philip Olson s’en étonne, et demande <a href="http://news.php.net/php.internals/63901">Where did the <em>logo</em> functions go?</a>.</p> <p>Le coeur de la discussion, en fait, ne porte pas tant sur la suppression en soit de ces fonctions <em>(elles n’étaient pas vraiment utiles, et pas tellement utilisées)</em>, mais sur le fait qu’elles aient été supprimées “par surprise”, sans qu’une RFC ne soit rédigée, ni qu’un avertissement <code>E_DEPRECATED</code> ne soit levé auparavant — en cela, le “processus” “standard” n’a pas vraiment été suivi…</p> <p><br></p> <p>Florin Razvan Patan a lancé une discussion autour d’une éventuelle implémentation d’une interface de logging au sein de PHP : <a href="http://news.php.net/php.internals/63777">Implement a LoggerInterface to PHP</a>.</p> <p>Une telle interface est un besoin récurrent de nombreuses applications, et une implémentation directement dans PHP apporterait de la cohérence entre frameworks, qui pourraient ainsi partager une interface commune ; en somme, elle aiderait à standardiser un peu les choses.</p> <p>Patrick Allaert <a href="http://news.php.net/php.internals/63778">répond</a> que ceci pourrait se faire via une extension PECL, et qu’il ne voit pas l’intérêt de l’implémenter dans le core de PHP ; après tout, une interface pourrait tout à fait être partagée entre différents projets, même si elle n’est pas native à PHP.</p> <p>En conclusion, il en ressort plusieurs avis disant que définir ce type d’interfaces fait parti du rôle du <a href="https://github.com/php-fig/fig-standards">FIG - Framework Interoperability Group</a>, et pas d’<code>internals@</code>.</p> <p><br></p> <p>Sara Golemon <a href="http://news.php.net/php.internals/64054">annonce</a> la RFC <a href="https://wiki.php.net/rfc/request-tempnam">Modify tempnam() to handle directories and auto-cleanup</a>, dont l’idée est de permettre une suppression automatique des fichiers temporaires créés depuis des scripts PHP.</p> <p><br></p> <p>Viennent enfin quelques travaux autour de l’amélioration de performances, notamment autour de <a href="http://news.php.net/php.internals/64121">Phar + APC</a>, des <a href="http://news.php.net/php.internals/64071">generators</a>, ou de <a href="http://news.php.net/php.internals/64031"><code>finally</code></a>.</p> <p><br></p> <hr> <p><strong><code>internals@lists.php.net</code></strong> est la <strong>mailing-list des développeurs de PHP</strong> ; elle est utilisée pour discuter des prochaines évolutions du langage, ainsi que pour échanger autour de suggestions d’améliorations ou de rapports de bugs. <br>Elle est publique, et tout le monde peut s’y inscrire depuis la page <a href="http://www.php.net/mailing-lists.php#internals">Mailing Lists</a>, ou consulter ses archives en HTTP depuis <a href="http://news.php.net/php.internals">php.internals</a> ou depuis le serveur de news <a href="news:/php.internals"><code>news://news.php.net/php.internals</code></a>.</p> <p><br></p> <div class="footnotes"> <hr> <ol> <li id="fn:note-suppression-logo"> <p>Au moment où PHP-5.5-alpha1 est sortie, les fonctions <code>*_logo_*()</code> n’y figurent plus ; cela dit, qui sait ? Il reste encore du temps avant la sortie de la première version stable, et les choses peuvent encore bouger. <a href="#fnref:note-suppression-logo">↩</a></p> </li> </ol> </div> http://blog.pascal-martin.fr/post/php-mailing-list-internals-novembre-2012#comment-new-form http://blog.pascal-martin.fr/post/php-mailing-list-internals-novembre-2012#comment-new-form