PHP
5.3 → 5.6

No pain but gain !

Appuyez sur [s] pour ouvrir les notes présentateur dans une nouvelle fenêtre.

Qui ?

Pourquoi ?

PHP 5.3

Juin 2009

  • Namespaces
  • Fonctions anonymes, closures
  • Late Static Binding
  • Phar, Fileinfo, Intl
  • Minimum requis !

PHP 5.4

Mars 2012

  • Traits
  • Serveur Web de test
  • Progression d'upload via ext/session
  • Passe de ménage

PHP 5.4

  • $arr = [10, 'plop'];
  • fonc()[42]
  • (new Plop())->method()
  • <?= indépendant de short_open_tag
  • Typehint callable
  • Interface JsonSerializable

PHP 5.5

Juin 2013

  • Generators et coroutines
  • API simplifiée de hachage de mots de passe
  • finally
  • Cache d'opcode inclus
  • ext/mysql obsolète

Exemple Generator

<?php
$generator = function ($path) {
    $file = fopen($path, 'r');
    while (!feof($file)) {
        yield trim(fgets($file));
    }
    fclose($file);
};

$iterator = $generator(__DIR__ . '/exemple.txt');
foreach ($iterator as $val) {
    echo $val, "\n";
}

PHP 5.5

  • foreach($arr as list($a, $b))
  • empty() sur expressions
  • ::class
  • foreach et clefs non-scalaires
  • [10,20,30][1] et 'plop'[2]

Et pourtant ?

PHP 5.x

Statistiques de versions de PHP

PHP 5.6

Release Candidate

  • Fonctions variadiques, unpacking d'arguments
  • Expressions scalaires constantes
  • Nombreuses améliorations SSL/TLS
  • Opérateur **
  • use function et use const

PHP 5.6

  • Surcharge d'opérateurs
    • Pour les extensions (uniquement)
    • Utilisé par GMP
  • hash_equals()
  • Support asynchrone pour pgsql
  • phpdbg

En plus de ça…

Performances

micro_bench.php

Performances, ligne de commandes, pas de cache d'opcode

Performances

Application web

Performances, application web, avec cache d'opcode

Attention !

Cycle de releases

  • Version mineure annuelle
  • Support 2 ans
  • + 1 an (sécurité)

Cycle de releases

Cycle de releases

EOL de PHP 5.3

  • 1 an après PHP 5.5.0
  • Maintenant !

Une question

« Est-ce que vous devez
mettre à jour PHP ? »

Bien sûr !

Plein de raisons pour MAJ

  • Features
  • Performances, Mémoire
  • Support, Sécurité
« Est-ce que vous devez
mettre à jour PHP ? »
« … Aujourd'hui ? »

Pas tout de suite ?

Réfléchir avant de se lancer

  • Motivation
  • Support par outils et frameworks
  • « Y'a pas le feu ! »
  • Disponibilité de paquets ?
  • Tests automatisés sur le projet ?

Quelques
problèmes
(potentiels)

Ajouts

  • Fonctions et classes
  • Mots-clefs
PHP Fatal error:  Cannot redeclare array_column() in ...
PHP Fatal error:  Cannot redeclare class CURLFile in ...

PHP Parse error:  syntax error, unexpected 'Yield' (T_YIELD),
    expecting identifier (T_STRING) ...

Suppressions

  • Fonctions
  • Extensions déplacées vers PECL
  • Extensions remplacées

Comportements
supprimés / altérés

  • register_globals, magic_quotes, safe_mode
  • Passage par référence à l'appel de fonctions
  • break $var et continue $var
  • Modifications sur pack() et unpack() ou json_decode()

Nouvelles erreurs ?

  • Messages d'erreurs améliorés
  • Fonctionnalités obsolètes : E_DEPRECATED
  • Nouvelles sécurités
  • Nouvelles notices

Array to String

define('APPLICATION_PREFIX', 'reports_');

$cacheKey = array($idUser, $pageId, $filters);

$cache->set('reports_' . $cacheKey, $data);
$cache->set('reports_Array', $data);

Depuis PHP 5.4

Notice: Array to string conversion in ... on line 25

Documentation

Lire les guides de migration !

Comment ?

Plusieurs approches possibles

Tout tester à la main

  • Long
  • Fastidieux
  • Risque d'oublis
  • Risque de régressions

Rejouer les logs de production

  • Rapide à mettre en place
  • Passe sur les pages publiques
  • Ne vérifie pas le contenu des pages
  • Ne couvre qu'une partie de l'application

Lancer les tests automatisés

  • Rapide, Automatisé
  • Vérifie la qualité des calculs
  • Non-régression
  • Couverture : dépend de vous ;-)

Analyse statique de code

  • Analyse syntaxique, sans exécution
  • Détection anticipée de certains types de problèmes
  • Y compris dans du code non couvert par les tests

En pratique : combinaison de plusieurs de ces approches

PHPCompatibility

  • Standard de code pour PHP_CodeSniffer
  • github.com/wimg/PHPCompatibility
  • Quelques exemples de détections
    • Fonctions obsolètes
    • Directives de configuration non renseignées
    • Variables obsolètes
    • Fonctions et classes ajoutées (re-déclarées)
    • break $var et continue $var

PHPCompatibility

Installation

curl -OL https://github.com/.../phpcs.phar

git clone https://github.com/wimg/PHPCompatibility.git \
    ~/bin/PHPCompatibility

PHPCompatibility

Exemple de rapport

php ~/bin/phpcs.phar --standard=$HOME/bin/PHPCompatibility/ruleset.xml \
    --runtime-set testVersion 5.5 ./src/

FILE: /home/pmartin/projects/tea-php/src/TEAEbook/test2.php
-----------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
-----------------------------------------------------------------------
 8 | ERROR | Using a call-time pass-by-reference
                is prohibited since php 5.4
-----------------------------------------------------------------------

PHPCompatibility

Exemple de rapport

php ~/bin/phpcs.phar --standard=$HOME/bin/PHPCompatibility/ruleset.xml \
    --runtime-set testVersion 5.3 ./src/

FILE: /home/pmartin/projects/tea-php/src/TEAEbook/test.php
-----------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
-----------------------------------------------------------------------
 5 | ERROR | "yield" keyword (for generators) is not present
                in PHP version 5.4 or earlier
-----------------------------------------------------------------------

PHPCompatibility

Limitations ?

  • Pas très rapide
  • Analyse statique / code dynamique
  • Support PHP 5.6

PHPCompatibility

Première étape, pour dégrossir

Penser aux tests automatisés : non régression !

Et les serveurs ?

Quelques
retours d'XP

Retours d'XP

Un développeur doit pouvoir changer de version de PHP facilement

Retours d'XP

IDE qui met en évidence les problèmes

Retours d'XP

Impliquer l'équipe

  • Revues de code
  • Tourner sur la version récente
  • Relever / corriger les problèmes !

Processus de migration

  • 1 développeur volontaire qui migre son poste
  • Serveur d'IC : 2 versions en parallèle
  • Fixer une date de migration (objectif)
  • Migrer les postes de dev petit à petit

Processus de migration

  • Migrer la preprod
  • Migrer la prod
  • Couper le serveur d'IC ancienne version
  • Communiquer et former !

Monter de version de PHP

Demande du temps, de la préparation…

… Mais pas tant que ça !

Pas toujours facile à justifier

  • Nécessaire (sécurité, frameworks, outils)
  • Travailler avec des outils récents
    ⇒ plus agréable, plus motivant !
  • Argument recrutement ;-)

Questions ?

http://blog.pascal-martin.fr
@pascal_martin