Faciliter la migration vers PHP 5.3

Maxime Varinard - Vaisonet

- Titre : Faciliter la migration vers PHP 5.3

- Auteur : Maxime Varinard - Vaisonet

- Parution : 7 octobre 2009

- Licence : Copyright ® 2009 Maxime Varinard - Vaisonet. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- 1. Présentation de l'auteur

- 2. Introduction

- 3. Préalable

- 4. Les fonctions à remplacer

- 5. Conclusion

1 - Présentation de l'auteur

Maxime Varinard est chef de projet chez Vaisonet (http://www.vaisonet.com), société utilisant notamment PHP 5 dans le développement d'application e-commerce. A l'occasion de la migration de notre application principale de PHP 5.2.9 à PHP 5.3, nous avons collecté dans cet article les astuces qui nous ont permis d'automatiser le plus possible cette migration.

2 - Introduction

L'objectif de cet article n'est pas de réécrire le guide de migration de PHP 5.2 à PHP 5.3 que l'on peut trouver ici : http://fr.php.net/manual/fr/migration53.php

Le but est d'en faciliter la mise en œuvre, en donnant les astuces permettant d'automatiser le plus possible la réécriture du code pour ne plus utiliser de fonctions dépréciées. Bien sûr, suivre à la lettre ces informations peut ne pas suffire à avoir une application 100% compatible PHP 5.3, mais le plus gros du travail sera fait.

3 - Préalable

Un IDE qui permet de rechercher et de remplacer des expressions régulières dans tous les fichiers d'un projet est nécessaire. NetBeans et Eclipse le font, mais aussi des éditeurs plus simples comme PsPad.

4 - Les fonctions à remplacer

call_user_method()

- Information : remplacer par call_user_func avec en tableau l'objet.

call_user_method_array()

- Information : il faut réécrire proprement le code. Un foreach ne serait pas suffisant, la fonction call_user_method() étant dépréciée. Il faudra utiliser désormais call_user_func.

define_syslog_variables()

- Information : suppression simple, les variables syslog n'ont plus besoin d'être initialisées.

- Chaîne de recherche : define_syslog_variables();

- Chaîne de remplacement : //define_syslog_variables()

ereg()

- Information : utiliser preg_match.

- ereg("regex", devient preg_match("#regex#",

- Précautions : penser à mettre les délimiteurs. Pas de remplacement automatique car il faut souvent corriger les expressions régulières (par exemple : "\." devient "."). Une relecture attentive s'impose.

ereg_replace()

- Information : utiliser preg_replace.

- ereg_replace("regex", devient preg_replace("#regex#",

- Précautions : penser à mettre les délimiteurs. Pas de remplacement automatique car il faut souvent corriger les expressions régulières (par exemple : "\." devient "."). Une relecture attentive s'impose.

eregi()

- Information : utiliser preg_match.

- eregi("regex", devient preg_match("#regex#i",

- Précautions : penser à mettre les délimiteurs et le i. Pas de remplacement automatique car il faut souvent corriger les expressions régulières (par exemple : "\." devient "."). Une relecture attentive s'impose.

eregi_replace()

- Information : utiliser preg_replace.

- eregi_replace("regex", devient preg_replace("#regex#i",

- Précautions : penser à mettre les délimiteurs et le i. Pas de remplacement automatique car il faut souvent corriger les expressions régulières (par exemple : "\." devient "."). Une relecture attentive s'impose.

set_magic_quotes_runtime()

- Information : pas de remplacement automatique possible. Il faut passer en revue ses requêtes et les échapper, par exemple avec mysqli_escape_string().

session_register()

- Information : utiliser $_SESSION['ma_variable'] = 'toto';

- Chaîne de recherche : [^_]session_register\((.*?)\)

- Chaîne de remplacement : \$_SESSION\[$1\]

- Précautions : le [^_] est utile si vous avez des éléments type monframework_session…

session_unregister()

- Information : utiliser unset($_SESSION['ma_variable'])

- Chaîne de recherche : [^_]session_unregister\((.*?)\)

- Chaîne de remplacement : unset\(\$_SESSION\[$1\]\)

- Précautions : le [^_] est utile si vous avez des éléments type monframework_session…

session_is_registered()

- Information : utiliser isset($_SESSION['ma_variable'])

- Chaîne de recherche : [^_]session_is_register\((.*?)\)

- Chaîne de remplacement : isset\(\$_SESSION\[$1\]\)

- Précautions : le [^_] est utile si vous avez des éléments type monframework_session…

set_socket_blocking()

- Information : fonction à remplacer.

- Chaîne de recherche : set_socket_blocking(

- Chaîne de remplacement : stream_set_blocking(

split()

- Information : utiliser preg_split.

- split("regex", devient preg_split("#regex#",

- Précautions : mettre les délimiteurs. Pas de remplacement automatique car il faut souvent corriger les expressions régulières (par exemple : "\." devient "."). Une relecture attentive s'impose. Explode() peut-être utile s'il n'y a pas besoin d'expression régulière.

spliti()

- Information : utiliser preg_split.

- spliti("regex", devient preg_split("#regex#i",

- Précautions : mettre les délimiteurs et le i. Pas de remplacement automatique car il faut souvent corriger les expressions régulières (par exemple : "\." devient "."). Une relecture attentive s'impose. Explode() peut-être utile s'il n'y a pas besoin d'expression régulière.

sql_regcase()

- Information : devient inutile avec les expressions régulières POSIX.

dl()

- Information : charger les extensions via php.ini à la place.

extension mysql

Je conseille de passer à mysqli, qui donne de meilleures performances. Inconvénient, on a souvent mysql*(A,B) qui devient mysqli*(B,A). Une relecture attentive du code est préférable à un changement automatisé.

mysql_db_query()

- Information : fonction à remplacer par mysql_select_db() + mysql_query()

- Chaîne de recherche : mysql_db_query(

- Chaîne de remplacement : mysql_query(

- Précautions : un remplacement automatique se fera généralement entre mysql_db_query et mysql_query. mysql_select_db pouvant être placé après mysql_connect.

mysql_escape_string()

- Information : fonction à remplacer.

- Chaîne de recherche : mysql_escape_string(

- Chaîne de remplacement : mysql_real_escape_string(

5 - Conclusion

La migration de mysql à mysqli est relativement facile si l'application a bien été pensée avec des fonctions d'accès à MySQL propres à l'application. Mais même sans cela, les gains en terme de performances sont tels, qu'il est vraiment intéressant d'y perdre un peu de temps.

Un code PHP 5.2 fonctionnera sans problème sous PHP 5.3 mais des notices seront générées en nombre. Et comme bien sûr vous enregistrez toutes les erreurs PHP en production dans un journal afin de détecter des bugs insoupçonnés, cela aura pour conséquence de rendre vos logs illisibles !

Commentez

Merci à mlny84 pour ses corrections, ainsi qu'à tous les autres relecteurs.