PHP 7.1 : quelques autres nouveautés, en vrac

14 septembre 2016php, php-7.1

This post is also available in English.
Ceci est le huitième article d’une série à propos de PHP 7.1.


Bien sûr, après un an de travail, les évolutions apportées par PHP 7.1 ne se limitent pas aux points que j’ai présentés ces deniers jours !

Voici donc la suite de cette liste de nouveautés, en regroupant ici la quasi-totalité des améliorations restantes, celles qui ne m’ont pas réellement marqué pour l’instant — mais qui intéresseront peut-être certains d’entre vous ?


Asynchronous Signal Handling

Jusqu’à PHP 7.0, la gestion de signaux par le biais de l’extension pcntl demandait d’appeler pcntl_signal_dispatch() manuellement en synchrone, ou d’utiliser declare(ticks=1) — qui a impact non négligeable sur l’exécution.

Nous utilisons de plus en plus largement PHP en ligne de commandes ou pour des scripts à longue durée de vie, cas où il est intéressant de gérer efficacement les signaux, moyen de communication interprocessus des plus classique. Pour répondre à ce besoin, PHP 7.1 permet désormais de gérer les signaux en asynchrone, à l’aide d’une nouvelle fonction pcntl_async_signals().

pcntl_async_signals(true);

pcntl_signal(SIGTERM, function ($signo) {
    var_dump("SIGTERM"); die;
});

while (true) {
    usleep(100);
}

Un signal TERM envoyé à notre processus (via kill 31321 en adaptant le PID ;-)) déclenchera l’exécution de la fonction anonyme qui affiche ici le nom du signal et met fin à l’exécution du script.

La directive de configuration pcntl.async_signals, à 0 par défaut, permet également d’activer ce fonctionnement de manière systématique, nous évitant alors l’appel à pcntl_async_signals(true). Il est probable que cette valeur par défaut change d’ici une prochaine version de PHP, d’ailleurs.

‣ La RFC : Asynchronous Signal Handling


Octal overflow detection

PHP permet d’inclure un octet dans une chaine de caractères en le représentant en octal :

$str = "Un caractère : \123";
var_dump($str);
// string(17) "Un caractère : S"

Mais, pour réellement tenir sur un octet, le premier digit de la représentation octale doit être compris entre 0 et 3 inclus. Un chiffre plus grand entraine en effet un overflow : "\400" correspond en réalité à "\000", "\500" est interprété comme "\100" et ainsi de suite. Ainsi, la portion de code reproduite ci-dessous donne le même résultat que celle vue plus haut :

$str = "Une tentative : \523";
var_dump($str);
// string(17) "Une tentative : S"

Cet overflow était silencieux jusqu’à PHP 7.0 inclus.
Avec PHP 7.1, le comportement reste identique, mais un avertissement est levé, pour indiquer au développeur qu’il a écrit quelque chose de bizarre :

Warning: Octal escape sequence overflow \523 is greater than \377 in .../demo-01.php on line 12

‣ La RFC : Octal overflow detection


Autres, à voir pour les curieux

Complètement en vrac pour terminer cette liste de nouveautés, voici les autres RFC qui sont passées et qui apportent des évolutions pour PHP 7.1 — sans que je ne présente plus d’exemples ni de reproduise de détail :

Ces évolutions ne devraient pas avoir d’impact majeur sur vos applications, mais peuvent toutefois aider dans certains cas — par exemple, en permettant une représentation plus précise des nombres flottants ou en commençant à introduire un support de HTTP/2.


La fin de cette série approche, mais il me reste encore quelques points à aborder.
Demain, nous verrons une liste d’idées évoquées pendant le cycle de développement de PHP 7.1 mais qui n’ont pas été adoptées.


Vous avez apprécié cet article ? Faites-le savoir !

Ce blog a récemment été migré vers un générateur de sites statiques et je n'ai pas encore eu le temps de remettre un mécanisme de commentaires en place.

Avec un peu de chance, je parviendrai à m'en occuper d'ici quelques semaines ;-)