PHP 7.1 : quelques autres nouveautés, en vrac

14 septembre 2016php, php-7.1
 Cet article a été rédigé il y a plusieurs années et peut ne plus être tout à fait à jour…

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.