PHP 7 était très attendu car l’axe choisi pour cette release est « performance » :
- Une vitesse d’exécution jusqu’à 2x supérieure
- Compatibilité 64 bits
- Utilisation de la mémoire vive réduit de 2/3
Pour toutes ces raisons, autant en faire profiter notre Owncloud 🙂
Vous devez être en Debian 8 Jessie minimum pour suivre ce billet? Vous aurez l’avantage de rester en Debian stable et disposer des améliorations de PHP 7. Si vous êtes sous Debian 9 stretch ou dérivé Ubuntu vous êtes déjà équipé 😀
Guillaume Plessis de Dotdeb met à disposition des paquets PHP 7 pour Debian 8 (Jessie). Pour rappel, on est toujours en PHP 5.6 sous Debian 8 et PHP 7 ne sera ajouté que sous Debian 9. Pour les détails je vous retourne vers son blog.
PHP7 son installation via des dépôts
Ajouter les dépôts si vous faites confiance à Guillaume Plessis :
~# wget -O- https://www.dotdeb.org/dotdeb.gpg | apt-key add -
~# echo "deb http://packages.dotdeb.org jessie all" > /etc/apt/sources.list.d/dotdeb.list
~# apt-get update
Lister tous les paquets de type PHP5 afin de ne pas oublier de module :
~# dpkg -l php5* | egrep '^ii' ii php5 5.6.17+dfsg-0+deb8u1 all server-side, HTML-embedded scripting language (metapackage) ii php5-apcu 4.0.7-1 amd64 APC User Cache for PHP 5 ii php5-cgi 5.6.17+dfsg-0+deb8u1 amd64 server-side, HTML-embedded scripting language (CGI binary) 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-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-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-sqlite 5.6.17+dfsg-0+deb8u1 amd64 SQLite module for php5
Pour lister rapidement les paquets de PHP 5 à supprimer :
~# dpkg -l php5* | egrep '^ii' | while read i name v a d ; do echo -n "$name " ; done
Vérifier que tous les paquets php7.0 sont dispo avec ce dépôt Debian :
~# apt-get install php7.0 php7.0-apcu php7.0-cgi php7.0-cli php7.0-curl php7.0-fpm php7.0-gd php7.0-json php7.0-mcrypt php7.0-mysql php7.0-sqlite
On supprime ensuite la liste donnée après vérification que tous ce que vous utilisiez est disponible pour php7.0 :
~# apt-get remove php5 php5-apcu php5-cgi php5-cli php5-common php5-curl php5-fpm php5-gd php5-intl php5-json php5-mcrypt php5-mysql php5-readline php5-sqlite
Installer les paquets correspondants :
~# apt-get install php7.0 php7.0-apcu php7.0-cgi php7.0-cli php7.0-curl php7.0-fpm php7.0-gd php7.0-json php7.0-mcrypt php7.0-mysql php7.0-sqlite Reading package lists... Done Building dependency tree Reading state information... Done Note, selecting 'php7.0-sqlite3' for regex 'php7.0-sqlite' The following packages were automatically installed and are no longer required: comerr-dev krb5-multidev libapr-memcache0 libblas3gf libdrm-nouveau1a libexiv2-12 libgcrypt11-dev libgd2-xpm libgnutlsxx27 libicu48 libidn11-dev libjpeg8 libkadm5clnt-mit8 libkdb5-6 libkrb5-dev liblcms1 libldap2-dev libmagickcore5 libmagickcore5-extra libmagickwand5 libmpc2 libp11-kit-dev libpango1.0-0 libpthread-stubs0 librsvg2-2 librsvg2-common librtmp0 libssh2-1-dev libssl-doc libtasn1-3-dev libtiff4 libtime-modules-perl python-central python-gnupginterface zlib1g-dev Use 'apt-get autoremove' to remove them. The following extra packages will be installed: php-common php-readline php7.0-common php7.0-opcache php7.0-readline Suggested packages: php-user-cache The following NEW packages will be installed: php-common php-readline php7.0 php7.0-apcu php7.0-cgi php7.0-cli php7.0-common php7.0-curl php7.0-fpm php7.0-gd php7.0-json php7.0-mcrypt php7.0-mysql php7.0-opcache php7.0-readline php7.0-sqlite3 0 upgraded, 16 newly installed, 0 to remove and 0 not upgraded. Need to get 10.0 MB of archives. After this operation, 44.7 MB of additional disk space will be used. Do you want to continue? [Y/n]
On installe ensuite le module Apache pour PHP 7 :
~# apt-get install libapache2-mod-php
Vérification de l’installation
Vérifier la version de PHP :
~# php -v ~# /etc/init.d/php7.0-fpm status [ ok ] php-fpm7.0 is running.
S’il y a encore php5-fmp qui est mis en démarrage :
~# ls -l /etc/rc?.d/*php* lrwxrwxrwx 1 root root 18 Mar 12 20:40 /etc/rc0.d/K01php5-fpm -> ../init.d/php5-fpm lrwxrwxrwx 1 root root 20 Mar 12 22:49 /etc/rc0.d/K01php7.0-fpm -> ../init.d/php7.0-fpm lrwxrwxrwx 1 root root 18 Mar 12 20:40 /etc/rc1.d/K01php5-fpm -> ../init.d/php5-fpm lrwxrwxrwx 1 root root 20 Mar 12 22:49 /etc/rc1.d/K01php7.0-fpm -> ../init.d/php7.0-fpm lrwxrwxrwx 1 root root 18 Mar 12 20:58 /etc/rc2.d/S01php5-fpm -> ../init.d/php5-fpm lrwxrwxrwx 1 root root 20 Mar 12 22:49 /etc/rc2.d/S01php7.0-fpm -> ../init.d/php7.0-fpm lrwxrwxrwx 1 root root 18 Mar 12 20:58 /etc/rc3.d/S01php5-fpm -> ../init.d/php5-fpm lrwxrwxrwx 1 root root 20 Mar 12 22:49 /etc/rc3.d/S01php7.0-fpm -> ../init.d/php7.0-fpm lrwxrwxrwx 1 root root 18 Mar 12 20:58 /etc/rc4.d/S01php5-fpm -> ../init.d/php5-fpm lrwxrwxrwx 1 root root 20 Mar 12 22:49 /etc/rc4.d/S01php7.0-fpm -> ../init.d/php7.0-fpm lrwxrwxrwx 1 root root 18 Mar 12 20:58 /etc/rc5.d/S01php5-fpm -> ../init.d/php5-fpm lrwxrwxrwx 1 root root 20 Mar 12 22:49 /etc/rc5.d/S01php7.0-fpm -> ../init.d/php7.0-fpm lrwxrwxrwx 1 root root 18 Mar 12 20:40 /etc/rc6.d/K01php5-fpm -> ../init.d/php5-fpm lrwxrwxrwx 1 root root 20 Mar 12 22:49 /etc/rc6.d/K01php7.0-fpm -> ../init.d/php7.0-fpm ~# update-rc.d php5-fpm remove ~# ls -l /etc/rc?.d/*php* lrwxrwxrwx 1 root root 20 Mar 12 22:49 /etc/rc0.d/K01php7.0-fpm -> ../init.d/php7.0-fpm lrwxrwxrwx 1 root root 20 Mar 12 22:49 /etc/rc1.d/K01php7.0-fpm -> ../init.d/php7.0-fpm lrwxrwxrwx 1 root root 20 Mar 12 22:49 /etc/rc2.d/S01php7.0-fpm -> ../init.d/php7.0-fpm lrwxrwxrwx 1 root root 20 Mar 12 22:49 /etc/rc3.d/S01php7.0-fpm -> ../init.d/php7.0-fpm lrwxrwxrwx 1 root root 20 Mar 12 22:49 /etc/rc4.d/S01php7.0-fpm -> ../init.d/php7.0-fpm lrwxrwxrwx 1 root root 20 Mar 12 22:49 /etc/rc5.d/S01php7.0-fpm -> ../init.d/php7.0-fpm lrwxrwxrwx 1 root root 20 Mar 12 22:49 /etc/rc6.d/K01php7.0-fpm -> ../init.d/php7.0-fpm
Ensuite un fichier de test contenant ceci pour valider que php fonctionne bien :
<?php phpinfo(); ?>
Et en essayant Owncloud, vous pourriez avoir ceci comme message d’erreur dans le format HTML :
Memcache \OC\Memcache\APC not available for local cache Is the matching PHP module installed and enabled?
C’est du à l’utilisation de memcached si vous l’aviez activé pour accélérer votre serveur.
Après vérification APCu est bien activé, et le problème est ailleurs : changement de nom de classe et des adaptation dans le code de Owncloud 8.2.1.4 sont à faire. Vous pouvez utiliser ce workarround pour php7. Mais également vous pouvez mettre à jour Owncloud vers la 8.2.3 ou passer le cap de la v9.
Vous pouvez faire un test en désactivant le memcache en désactivant la ligne suivant dans le fichier /var/www/owncloud/config/config.php :
'memcache.local' => '\OC\Memcache\APC',
Vous retrouverez votre interface.
Dans mon cas je n’ai pas été plus loin avec memcached car il a trouvé un remplaçant depuis quelques temps…. Il ne reste plus qu’à remplacer votre memcached par redis, qui est un cache plus performant, afin de retrouver un peu de rapidité! J’en parle dans un prochain billet.
Retour rapide sur le gain de Performance de PHP7
Ces graphiques sont pour une application WordPress. Voici le temps de réponse dynamique (bleu clair) et static (bleu foncé). On peut voir une baisse du temps de réponse sur le dernier tiers. Ce n’est pas énorme comme boost mais c’est toujours ça de gagné 🙂
Sur le CPU on remarque également une diminution de la charge :
En conclusion, ce remplacement de PHP 5.6 en PHP 7 est bien bénéfique pour mon utilisation (WordPress). Mais je n’ai par contre pas de statistiques valable pour Owncloud car c’est une utilisation personnelle et donc peu de trafic pour une comparaison.
23 mai 2017 at 16:45
Bonjour,
Simplement pour dire merci pour ce document qui nous a permis de passer de php5 à 7 sur notre owncloud 9.
Cdlt,