PHP
5.3 → 5.6
No pain but gain !
Appuyez sur [s] pour ouvrir les notes présentateur dans une nouvelle fenêtre.
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]
PHP 5.x
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
Performances
micro_bench.php
Performances
Application web
Attention !
Cycle de releases
- Version mineure annuelle
- Support 2 ans
- + 1 an (sécurité)
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 !
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 ?
- Paquets de la distribution
-
Paquets de la communauté
- Création de paquets
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 ;-)
Comment ?