Adapter et migrer votre ancien site PHP vers PHP8

Articledéveloppement

Publié par le , mis à jour le (28927 lectures)

php

Vous savez déjà sûrement que PHP8 est la version actuelle de PHP, et que la branche 7 est officiellement en fin de vie (end of life). La version 8.0 précisément ne dispose plus que de correctifs de sécurité, il faut en réalité viser PHP 8.1 et 8.2, respectivement maintenus jusqu'en 2024 et 2025.

Logo PHP

De nombreux sites sont encore hébergés en PHP 7, voire dans de précédentes versions, ce qui peut conduire à des incompatibilités à terme, de plus en plus difficiles à maintenir, et des failles de sécurité.

Calendrier de support PHP

Les évolutions vers PHP 8.1 ou 8.2 (et ainsi de suite) seront nécessairement plus évidentes en partant de PHP8. Un saut majeur de la 7 à la 8 amène des changements plus importants. Il n'est pas possible de prévoir et appliquer une seule tactique : cela va dépendre de votre base de code actuelle, des dépendances utilisées, du CMS ou framework s'il y en a un, et surtout du code maison ajouté.

Par quoi débuter ?

En premier lieu, la documentation officielle est toujours un bon point de départ, avec les guides de migration d'une version à l'autre. Citons dans le cas présent Migration de PHP 7.4.x vers PHP 8.0.x, ainsi que le fichier UPGRADING sur le repo GitHub de PHP.

Le but ici est de pouvoir estimer les grandes phases, la faisabilité : savoir si en l'état votre projet est concerné et quel sera le temps nécessaire d'adaptation. S'agit-il de quelques correctifs mineurs et syntaxiques, ou d'une obligation de revoir l'architecture globale ?

Quels bugs peuvent surgir ?

PHP devenant plus "strict" au fur et à mesure des versions, les premières erreurs ou les premiers avertissements qui peuvent survenir à l'exécution vont concerner la syntaxe, l'appel de fonctions, le typage de variables ou l'usage de valeurs indéfinies, les mots clés, notamment :

  • PHP8 a ajouté des erreurs de type Uncaught Error qui auparavant provoquaient des avertissements ou des erreurs fatales : par exemple, en appelant une méthode sur une valeur null.
  • Les erreurs TypeError sont plus strictes : en appelant une fonction avec des arguments de type incorrect, cela peut entraîner une erreur de cette sorte, par exemple pour les fonctions de manipulation de texte qui s'attendent à recevoir en paramètre un string qui aurait en réalité pour valeur null. Dans ce cas, un patch rapide serait d'utiliser l'opérateur Null coalescent : $variable ?? ''
  • Certaines opérations d'union, de coalescence et de comparaison ont été modifiées pour être plus strictes.
  • Des mots réservés ont été ajoutés https://www.php.net/manual/fr/reserved.other-reserved-words.php

Quels sont les outils permettant d'aider à une migration ?

Tout d'abord, ne changez pas tout d'un seul coup en production, chez votre hébergeur même si la plupart permettent de changer la version à la volée, sans possibilité de retour en arrière. Il y a un fort risque que cela ne fonctionne pas du premier coup. Testez en local pour vous assurer que tout fonctionne au préalable (par exemple à l'aide de Docker, voir ci-après).

Pour faire une analyse locale du code et relever les passages qui pourraient poser problème, un certain nombre d'outils existent. Si votre machine locale sert au développement, connaître la version de PHP installée avec php --version est une première étape (sauf si vous vous servez de Docker évidemment).

En général il vous faudra git et aussi composer installable dans la plupart des systèmes (sur Linux ou équivalent) via curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer.

phan

phan est un analyseur statique. Il faut l'installer, le configurer en définissant la version cible à atteindre, le dossier à examiner, les plugins à activer.

composer require phan/phan

Créer un fichier de configuration dans le dossier .phan/config.php en suivant le modèle : https://github.com/phan/phan/wiki/Getting-Started#creating-a-config-file et notamment en modifiant la ligne 'target_php_version' => '8.1', avec la bonne version.

Puis lancer ./vendor/bin/phan. Il est possible à ce stade qu'il vous faille également installer pecl install ast et ajouter extension=ast.so à php.ini.

L'analyse se lance et produit moult résultats en vrac

analyze ████████████████████████████████████████████████████████████ 100.0% 204MB/205MB

Pour les rediriger vers un fichier lisible ajoutez >phan-log.txt à l'instruction précédente, puis ouvrez-le tranquillement avec votre éditeur de code.

phpstan

phpstan vérifie la syntaxe, à la recherche d'erreurs, sans exécuter votre code. La documentation de phpstan est bien conçue.

composer require --dev phpstan/phpstan
# Lancer l'analyse où www est votre dossier de code source
vendor/bin/phpstan analyse www --memory-limit 1024M

L'analyse se déroule...

240/452 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░░░░░░░░░░]  53%

Et dévoile les résultats fichier par fichier.

------ -------------------------------------------------------------------------------- 
  Line   app/helpers/string.php                                                
 ------ -------------------------------------------------------------------------------- 
  207    Function random_string() should return string but return statement is missing.  
 ------ -------------------------------------------------------------------------------- 

Pour les rediriger vers un fichier lisible ajoutez >phpstan-log.txt à l'instruction précédente, puis ouvrez-le tranquillement avec votre éditeur de code.

PHPCompatibility

PHPCompatibility est un ensemble de compléments pour PHP CodeSniffer qui vérifie la compatibilité entre plusieurs versions de PHP, et qui fonctionne à partir de PHP 5.4

composer require squizlabs/php_codesniffer --dev
composer require phpcompatibility/php-compatibility --dev

# Lancer l'analyse où "www" est le nom du dossier contenant le code source
vendor/bin/phpcs -p ./www --extensions=php --standard=vendor/phpcompatibility/php-compatibility/PHPCompatibility --runtime-set testVersion 8.2

L'analyse se lancera alors avec affichage de la progression...

.............................................WW.............  60 / 452 (13%)
......W......................W...........W.................. 120 / 452 (27%)
............................................................ 180 / 452 (40%)
............................................................ 240 / 452 (53%)
......EW....W..W.W.E....E...W........EEEEE.E.E.EE........... 300 / 452 (66%)
............E....................E.E........................ 360 / 452 (80%)
.............................WEE..W.........E....W......W... 420 / 452 (93%)
W...............................                             452 / 452 (100%)

Et un inventaire des fichiers et des erreurs ou avertissements avec explications...

FILE: /var/www/unfichier.php
-----------------------------------------------------------------------------------------------------------
FOUND 0 ERRORS AND 1 WARNING AFFECTING 1 LINE
-----------------------------------------------------------------------------------------------------------
 108 | WARNING | Function create_function() is deprecated since PHP 7.2; Use an anonymous function instead
-----------------------------------------------------------------------------------------------------------

Pour rediriger l'analyse vers un fichier lisible plutôt que de remplir tout le terminal, ajoutez >phpcs-log.txt puis ouvrez-le tranquillement avec votre éditeur de code.

Si vous avez un grand nombre de fichiers à analyser, vous devrez peut être augmenter le paramètre memory_limit de php.ini (utilisez la commande php --ini pour savoir où se trouve le fichier utilisé), ou ajouter à la commande -d memory_limit=1024M.

Docker

Docker n'est pas en soi dédié à PHP, mais permettra de tester très facilement si votre projet, votre site tourne bien avec une quelconque version de PHP. Si votre projet fonctionne avec l'image PHP7.x, alors vous pouvez de manière très souple changer la version dans le fichier Dockerfile, par exemple FROM php:7.4-apache vers FROM php:8.2-apache , relancer le conteneur et procéder pas à pas.

Et WordPress ?

La compatibilité de WordPress avec les versions les plus fraîches de PHP n'est pas toujours évidente. Dans notre expérience nous avons plusieurs fois constaté des erreurs, avertissements en essayant d'utiliser les versions les plus récentes de PHP, avec la branche actuelle de WordPress. Cependant la situation s'améliore constamment et les difficultés proviennent plus souvent des extensions (alimentées par la communauté, mais pas toujours maintenues aussi activement qu'il le faudrait).

  • WordPress 6.2 fonctionne bien avec PHP 8.1
  • Les versions 5.6 à 6.2 de WordPress fonctionnent toujours bien avec PHP 5.6 à PHP 7.4, pour des raisons de rétro-compatibilité.

Commentaires

Je suis à peine en train de laborieusement migrer vers 7.4. xD

Et à peine en 7.x depuis un an, j'avais tous mes projets en 5.5 (bon, plus par erreur, j'avais bien passé le serveur en 7.x mais pas le .ovhconfig qui outrepassait la config serveur en forçant du 5.5 (fichier évidement plus ouvert depuis une éternité)).

Quand on fait pas beaucoup de backend, ou même de web en général, ca devient un peu chiant ces MAJs importantes et régulières.

Commenter

Vous devez être inscrit et identifié pour utiliser cette fonction.

Connectez-vous (déjà inscrit)

Oubli de mot de passe ? Pas de panique, on va le retrouver

Pas encore inscrit ? C'est très simple et gratuit.