Goufablog

Geek, nouvelles technologies, société et jeux vidéos!
23
août
2010
Ma migration PHP4 vers PHP5
Technique - par Goufalite - 4119 hits

PHP

Étant encore en version 1.8 d'EasyPHP et ayant marre des messages d'alerte m'indiquant la présence d'une nouvelle version des outils, je me suis pris par la main et j'ai téléchargé la dernière version d'EasyPHP contenant PHP 5.3.2i. Malheureusement tout n'est pas comme dans le monde des bisounours et je me suis confronté à quelques problèmes :

  • les pages s'affichaient mal
  • des fonctions obsolètes sont apparues
  • quelques problèmes pour restaurer la base de données

Je vais donc vous donner quelques conseils pour palier à ces petits soucis et vous aider à faire une meilleure migration vers PHP5 sur EasyPHP.

Pré-requis

Mais avant de commencer, préparez-vous bien avec quelques manipulations et quelques outils :

  • téléchargez et installez notepad++, il s'agit d'un éditeur de texte performant multi-plate-forme qui va nous aider notamment grâce à sa recherche dans les fichiers d'un dossier et la recherche en expression régulières.
  • SAUVEGARDEZ TUDJU!!!! Sauvegardez le contenu de votre répertoire www et mysql_data. Je ne suis pas responsable des pertes de données ou de fichiers suite aux manipulations ci-dessous!
  • faîtes un export de votre base en fichier texte ou autre. Grâce à votre nouvel éditeur, surveillez le bon passage des accents au besoin.
  • gardez une installation de votre ancien serveur pour tester la non régression et récupérer votre base de données, nous verrons cela plus loin.

Les pages ne s'affichent pas correctement

Pour se simplifier la vie ou tout simplement en copiant-collant du code sur le net, je me suis retrouvé avec plein de balises courtes (<?, <?=,...). La directive short_tags permet de déterminer si le serveur veut bien les reconnaître ou non. Laissez ce paramètre à false, il permettra de mettre un peu de rigueur dans votre code en spécifiant précisément quel langage vous utilisez côté serveur. Maintenant il faut remplacer tous les mini-tags par des tags normaux.

Pour cela, on va utiliser notre nouvel éditeur de texte et ses fonctions d'expressions régulières. Vous avez fait la sauvegarde? On y va!

Remplacement des <?

Interface de recherche de notepad++
Interface de recherche de notepad++

L'expression régulière est "remplacer toutes les balises <?. Ouvrez donc Notepad++ et faîtes Edition > Rechercher > Fichiers dans les dossiers. Cochez le bouton "expressions régulières" et remplissez les zones de texte :

Rechercher :

<?

Vérifiez la liste qui vous est fournie en contrôlant tous vos langages serveurs ou autres (xml par exemple). Rajoutez éventuellement les balises non php avec leur texte long (<?xml par exemple).

Remplacer par :

<?php

Ajoutez un espace à la fin de l'expression de remplacement. Ne regardez pas votre code maintenant, vous allez avoir peur! J'espère que vous avez sauvegardé!

Remplacement des <?=

L'expression régulière est "remplacer tout le contenu entre <?= et ?> par <?php echo ... ; ?>". Attention, on a déjà remplacé les <? existants!

Rechercher :

<?php=(.*)?>

Remplacer par :

<?php echo \1; >

Remise en forme des <? surchargés

Eh oui, vous allez trouver des <?phpphp ou <?phpxml restants du premier remplacement. Heureusement que vous avez mis au propre les autres balises non php avant de faire tout ça. Nous allons nous en occuper :

Recherchez :

<?php([a-zA-Z0-9]+)

Remplacez par :

<?\1

Pour vérifier, relancez votre site pour guetter les éventuelles erreurs d'affichage. On continue?

Fonctions obsolètes

En migrant j'ai eu affaire à deux groupes de fonctions obsolètes : des fonctions de session et les fonctions ereg*. Si vous tombez sur d'autres fonctions obsolètes, je vous laisse consulter la documentation PHP

Les sessions

D'après les messages d'alerte, les fonctions session_register et session_unregister sont obsolètes et donc amenées à disparaître dans les prochaines versions. Le contournement est simple :

Rechercher :

session_register\((.*)\);

Remplacer par :

$_SESSION[\1] = 0; // ou ""; si c'est du texte

Rechercher :

session_unregister\((.*)\);

Remplacer par :

unset($_SESSION[\1]);

Les fonctions ereg

La version 5 de PHP choisit de déprécier les fonctions traitant les expressions régulières de type POSIX pour laisser place aux PCRE (Perl Compatible Regular Expression). En gros il s'agit d'expressions régulières améliorées, mais elles ont un format différent... Vous pourrez trouver toute la documentation sur le site de PHP

Les PCRE ont un masque de délimitation. Par exemple :

Je.*cherche

devient

#Je.*cherche#

Le masque de délimitation peut être n'importe quel caractère, de préférence un qui n'est pas dans l'expression elle-même, sinon il suffit de l'échapper.

#Je\#.*cherche#

Après les délimiteurs, on peut mettre un masque comme pour des options supplémentaires de recherche. Par exemple i permet de faire une recherche en ignorant la casse :

#Je.*cherche#i

Pour résumer, voici les fonctions à remplacer avec un délimiteur générique :

AvantAprès
ereg\((.*),(.*)\)preg_match(\1,\2)
eregi\((.*),(.*)\)preg_match(\1i,\2)
ereg_replace\((.*),(.*),(.*)\)preg_replace(\1,\2,\3)
eregi_replace\((.*),(.*),(.*)\)preg_match(\1i,\2,\3)
split\((.*),(.*)\)preg_split(\1,\2)

Il vous faudra par contre ajouter les délimiteurs et surveiller la moindre expression changée pour être sûr(e) quelle corresponde bien à vos attentes.

La base de données

Apparemment déplacer les fichiers ou reparamétrer le répertoire ne suffit pas à faire fonctionner la base qui passe quand même de 4.1.9 à 5.1.49! La seule solution que j'ai trouvé pour migrer les données consiste à faire un export de l'ancienne base et un import dans la nouvelle.

Encodage

Attention aux formats d'exportation et d'importation notamment si vous manipulez des accents, vous devez garder le même format entre l'encodage de l'ancienne base, le fichier d'exportation et le format de la nouvelle base. Pour passer d'un format à l'autre, servez-vous du fichier et convertissez le avec Notepad++ (Format > Convertir en UTF-8/ANSI).

Passez au mysqli

PHP5 propose une nouvelle librairie, mysqli, qui intègre quelques fonctionnalités supplémentaires en plus de la librairie mysql de base. Par exemple l'encodage est mieux supporté et il est possible d'utiliser une instance de connexion sous la forme d'un objet.

Assurez-vous quand même que votre hébergeur final aura cette extension ou au pire demandez-la lui.

Pour partir du plus simple et migrer rapidement, il faudrait remplacer l'ensemble des fonctions de votre code par des fonctions mysqli au lieu de définir un objet d'instance. Je n'ai pour ma part pas eu le besoin de passer en mysqli, mais la documentation de PHP stipule qu'il est intéressant pour un nouveau projet d'utiliser cette bibliothèque.

Bilan

Tous les points que j'ai rencontré plus haut sont ceux qui m'ont bloqué personnellement dans ma migration. Il se peut donc que vous trouviez des écarts, notamment lors du remplacement de texte. Si vous vous trompez, récupérez la dernière sauvegarde de votre fichier et comparez vos modifications avec la duplication des vues. Grâce à ce tutoriel, vous avez pu en savoir plus sur les expressions régulières et sur certains réglages de votre serveur Apache-PHP-Mysql. Vérifiez quand même la configuration de votre futur serveur avant de mettre en place vos modifications!

+ Sources des images


Vous pouvez aussi lire :

GoufaliteGoufalite - Site Web - Steam - Twitter
Rédacteur et programmeur principal du Goufablog. Ingénieur de profession et avide de connaissances technologiques et scientifiques il partage son savoir à travers ces différents articles. Plus de renseignements sur la page de contact.
RSS Voir ses articles...
CC-BY-SACet article est protégé par une licence CC-BY-SA.


Tags : easyphp, migration, mysqli, php, php4, php5, sauvegarde
Delicious   Facebook   Commentaires(0) | Permalink
Sans commentaires!
Votre avis?
(Obligatoire)

Site et style réalisé par Goufalite
Reproduction interdite sans l'accord de l'auteur.
Valid XHTML 1.0 Transitional Optimisé pour FireFox 2
avec une résolution 1024*768