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é 😀

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.

acpu détail php7

 

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é 🙂

temps de réponse PHP7

Sur le CPU on remarque également une diminution de la charge :

graphique cpu php7

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.