PHP 7.1 : quelques autres nouveautés, en vrac
14 septembre 2016 —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 :
ext/curl
HTTP/2 Server Push Support- OpenSSL AEAD support
IntlTimeZone::getWindowsID()
- More precise float value
- Add
curl_multi_errno()
,curl_share_errno()
andcurl_share_strerror()
- Additional Context in pcntl_signal Handler
- RNG fixes
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.