Upgrader en PHP 7 sur Debian
PHP 7 vient de sortir en décembre dernier et promet des gains importants de performance. La tentation étant trop forte, j’ai upgradé mon serveur durant le week-end. Et effectivement, sur WordPress, pas besoin de tests pour sentir la différence.
Ce post va donc expliquer comment migrer de manière assez « safe » son serveur Debian vers cette nouvelle version de PHP en s’appuyant sur les packages mis à disposition par Dotdeb.
Quelques Précisions et Warning
Le repository de dotdeb ne fournit PHP 7 que pour la dernière version de Debian Jessie. Il faudra donc faire une mise à niveau pour les serveurs sous Wheezy, ou utiliser une autre méthode.
PHP 7 n’est pas encore si mature que ça. Le PHP Group en est déjà à la version 7.0.4 en 3 mois corrigeant essentiellement des failles de sécurité. Même chose pour le support des extensions PECL (memcache, etc.).
Et tout les applicatifs PHP ne sont pas forcément 100% compatible avec PHP 7. WordPress marche très bien, c’est loin d’être le cas de tous les plug-ins. D’ailleurs, je recommande fortement de désactiver l’utilisation de memcache par W3TC.
Ceci dit, utiliser un repository permet un retour arrière simple et rapide. 🙂 Pas de risque donc de casser quoique ce soit. Testez juste bien tous vos applicatifs après la mise à jour.
Installer Dotdeb
Pour installer Dotdeb, il suffit de rajouter le fichier suivant à vos sources :
1 2 3 4 | root@server:~# cat /etc/apt/sources.list.d/dotdeb.list # Dot deb Repository. See www.dotdeb.org deb http://packages.dotdeb.org jessie all deb-src http://packages.dotdeb.org jessie all |
Suivi d’une synchronisation de l’index des packages avec éventuelle mise à jour :
1 | root@server:~# apt-get update && apt-get upgrade |
Attention, Dotdeb fournit aussi des mises à jour pour Nginx, MySQL entre autre. Normalement pas de soucis, mais vérifiez bien quand même le bon fonctionnement après les mises-à-jour.
Identifier ses packages PHP 5
Ici, il s’agit juste d’identifier les packages PHP 5 utilisés par le système. On pourra alors les remplacer, normalement, par leur équivalent PHP 7.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | root@server:~# dpkg -l | grep php5 ii dh-php5 0.2 all debhelper add-on to handle PHP PECL extensions ii libapache2-mod-php5 5.6.17+dfsg-0+deb8u1 amd64 server-side, HTML-embedded scripting language (Apache 2 module) ii php5 5.6.17+dfsg-0+deb8u1 all server-side, HTML-embedded scripting language (metapackage) ii php5-cli 5.6.17+dfsg-0+deb8u1 amd64 command-line interpreter for the php5 scripting language ii php5-common 5.6.17+dfsg-0+deb8u1 amd64 Common files for packages built from the php5 source ii php5-curl 5.6.17+dfsg-0+deb8u1 amd64 CURL module for php5 ii php5-dev 5.6.17+dfsg-0+deb8u1 amd64 Files for PHP5 module development ii php5-fpm 5.6.17+dfsg-0+deb8u1 amd64 server-side, HTML-embedded scripting language (FPM-CGI binary) ii php5-gd 5.6.17+dfsg-0+deb8u1 amd64 GD module for php5 ii php5-intl 5.6.17+dfsg-0+deb8u1 amd64 internationalisation module for php5 ii php5-json 1.3.6-1 amd64 JSON module for php5 ii php5-mcrypt 5.6.17+dfsg-0+deb8u1 amd64 MCrypt module for php5 ii php5-memcache 3.0.8-5 amd64 memcache extension module for PHP5 ii php5-memcached 2.2.0-2 amd64 memcached extension module for PHP5, uses libmemcached ii php5-mysql 5.6.17+dfsg-0+deb8u1 amd64 MySQL module for php5 ii php5-readline 5.6.17+dfsg-0+deb8u1 amd64 Readline module for php5 ii php5-tidy 5.6.17+dfsg-0+deb8u1 amd64 tidy module for php5 |
Désinstaller PHP 5
Officiellement, les packages PHP 5 et PHP 7 sont maintenant co-installables. Mais dans le doute, il me semble mieux de les enlever avec un simple apt-get remove sur la liste des packages précédemment identifiés.
Sur mon serveur cela donne :
1 | root@server:~# apt-get remove dh-php5 libapache2-mod-php5 php5 php5-cli php5-common php5-curl php5-dev php5-fpm php5-gd php5-intl php5-json php5-mcrypt php5-memcache php5-memcached php5-mysql php5-readline php5-tidy |
Évitez l’option purge afin de conserver les configurations en cas de retour arrière. Et bien évidemment, il s’agit ici de la liste des packages qui étaient présents sur mon serveur, adaptez la à votre environnement.
Installer PHP 7
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | root@server:~# apt-get install libapache2-mod-php7.0 php7.0 php7.0-cli php7.0-common php7.0-curl php7.0-dev php7.0-fpm php7.0-gd php7.0-intl php7.0-json php7.0-mcrypt php7.0-memcache php7.0-memcached php7.0-mysql php7.0-readline php7.0-tidy Reading package lists... Done Building dependency tree Reading state information... Done Note, selecting 'php7.0-memcached' for regex 'php7.0-memcache' The following extra packages will be installed: php-pear php-readline php5-cli php5-common php5-json php5-readline php7.0-igbinary php7.0-msgpack php7.0-opcache pkg-php-tools Suggested packages: php5-dev php5-user-cache php-user-cache dh-make Recommended packages: dh-php7.0 The following NEW packages will be installed: libapache2-mod-php7.0 php-pear php-readline php5-cli php5-common php5-json php5-readline php7.0 php7.0-cli php7.0-common php7.0-curl php7.0-dev php7.0-fpm php7.0-gd php7.0-igbinary php7.0-intl php7.0-json php7.0-mcrypt php7.0-memcached php7.0-msgpack php7.0-mysql php7.0-opcache php7.0-readline php7.0-tidy pkg-php-tools 0 upgraded, 25 newly installed, 0 to remove and 0 not upgraded. Need to get 0 B/11.5 MB of archives. After this operation, 52.6 MB of additional disk space will be used. Do you want to continue? [Y/n] [...] |
Le package dh-php7.0 n’est pas oublié ! Il n’est tout simplement pas encore (?) disponible dans le repository. J’espère que vous n’aviez pas l’intention de compiler des packages php! 🙁
1 2 3 4 5 | root@server:~# apt-get install dh-php7.0 [...] Package dh-php7.0 is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is only available from another source |
Reconfigurer Nginx
Si vous avez configuré Nginx pour utiliser php5-fpm avec un socket unix, il va falloir remplacer dans tous vos fichiers de config Nginx « unix:/var/run/php5-fpm.sock » par « unix:/var/run/php/php7.0-fpm.sock ».
Si vous suivez la bonne pratique consistant à centraliser les éléments de config PHP dans un seul fichier php_params, c’est simple.
1 2 3 | root@server:~# cat /etc/nginx/php_params | grep fastcgi_pass #fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; |
Si vous utilisez un socket tcp, par exemple « fastcgi_pass 127.0.0.1:9000 », normalement, il n’y a rien à changer.
Il ne reste plus qu’à recharger la nouvelle configuration :
1 2 3 4 | root@server:~# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful root@ns203445:~# service nginx reload |
Et pour Apache ? Honnêtement, je n’en sais rien comme je ne l’utilise plus. J’imagine que la librairie libapache2-mod-php7.0 suffit, mais je n’ai pas du tout testé.
Quelques Vérifications
Voilà, c’est fini ! Il ne reste plus qu’à vérifier que tous vos sites en PHP fonctionnent toujours correctement et à déboguer si ce n’est pas le cas.
Au moins un premier test générique :
1 2 3 4 5 | root@server:~# php -version PHP 7.0.4-1~dotdeb+8.1 (cli) ( NTS ) Copyright (c) 1997-2016 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies |
Ensuite, affichez la page classique de phpinfo(). Le fichier info.php suivant est à placer à la racine du serveur web.
1 2 3 4 5 | root@server:/var/www# cat info.php <?php // Affiche toutes les informations, comme le ferait INFO_ALL phpinfo(); ?> |
Ce qui donne quelque chose comme cela :
N’oubliez pas d’enlever le fichier info.php après les tests pour des raisons de sécurité !
Quelques Mots pour Conclure
Comme mentionné initialement, toute cette procédure est complètement réversible. Peu de risque, surtout si vous n’utilisez pas d’obscurs plug-ins mal codés ou plus maintenus depuis 3 ans.
Et si malheureusement vous rencontriez des problèmes, essayez d’identifier le code/plug-in PHP responsable. Ensuite, soit vous attendez une mise-à-jour, soit vous le remplacez par un équivalent.
Mais si tout marche bien, « enjoy » ! 🙂