AngristanLe blog tech d'Angristan

Installer PHP 7 sous Debian 8 Jessie via le dépôt Dotdeb

Très attendue, la dernière version majeure de PHP vient de sortir, et contrairement aux anciennes versions, celle-ci ne se concentre pas sur les fonctionnalités mais plutôt sur les performances.

Voici ce que va donner un bon coup de turbo à la plupart des sites web :

  • Une vitesse d'exécution jusqu'à 2x supérieure
  • Compatibilité 64 bits
  • Utilisation de la mémoire vive réduit de 2/3

Malheureusement, PHP 7 ne sera pas disponible dans les dépôts de Debian avant plusieurs années (Debian 9), puisqu'elle n'accepte que les correctifs pour la version en cours.

C'est pour ça qu'il existe Dotdeb, un dépôt non-officiel pour Debian qui contient des versions plus récentes de Nginx, MySQL et bien sûr, PHP.

Dès le lendemain de la sortie, PHP 7 était dispo sur Dotdeb. Voyons comme l'installer.

Installation

Ajout du dépot Dotdeb

echo "deb http://packages.dotdeb.org jessie all" > /etc/apt/sources.list.d/dotdeb.list
wget -O- https://www.dotdeb.org/dotdeb.gpg | apt-key add - apt update

Suppression de PHP 5

systemctl stop php5-fpm
apt-get autoremove --purge php5*

Installation de PHP 7 ainsi que quelques dépendances

Si vous utilisez Nginx :

apt install php7.0 php7.0-fpm php7.0-mysql php7.0-curl php7.0-json php7.0-gd php7.0-mcrypt php7.0-msgpack php7.0-memcached php7.0-intl php7.0-sqlite3 php7.0-gmp php7.0-geoip php7.0-mbstring php7.0-xml php7.0-zip

Si vous utilisez Apache :

apt install php7.0 libapache2-mod-php7.0 php7.0-mysql php7.0-curl php7.0-json php7.0-gd php7.0-mcrypt php7.0-msgpack php7.0-memcached php7.0-intl php7.0-sqlite3 php7.0-gmp php7.0-geoip php7.0-mbstring php7.0-xml php7.0-zip

On peut vérifier la version installée avec php -v.

Configuration

Apache

Sous Apache, le module PHP s'active automatiquement. :)

Nginx

Le socket d'écoute de PHP-FPM change et passe de

/var/run/php5-fpm.sock

à

/run/php/php7.0-fpm.sock

Vous devrez donc faire les modifications adéquates dans votre configuration si vous utilisez PHP-FPM avec Nginx. Par exemple dans votre server block vous devriez avoir ceci :

server {
  ###
  # Votre conf...
  ###
  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_intercept_errors on;
    fastcgi_ignore_client_abort off;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
   }
}

On notera également que les fichiers de configuration se trouvent dans /etc/php/

OPcache

OPcache est une extension qui permet à PHP de garder le code compilé en mémoire pendant un certain temps afin de gagner en efficacité si ce code est exécuté plusieurs fois. Il est présent par défaut dans PHP depuis la version 5.5.

Bien que OPcache soit activé par défaut, on peut quand même ajouter quelques options dans la configuration pour le rendre plus efficace.

La configuration du module se trouve dans /etc/php/mods-available/opcache.ini

Par défaut il y a seulement :

zend_extension=opcache.so

Voici quelques lignes que j'ai ajouté en piochant dans la documentation :

opcache.memory_consumption=512
opcache.revalidate_freq=60
opcache.validate_timestamps=1
opcache.max_accelerated_files=5000

J'ai donc alloué 512Mo de RAM maximum à OPcache.

La valeur revalidate_freq est très importante puisque c'est le temps en seconde pour lequel OPcache ne vérifie pas les mises à jour du code. Faites donc attention si vous êtes dans un environnement de production avec beaucoup de changements de fichiers.

Je vous laisse consulter la description des différentes options dans la documentation.

phpMyAdmin

Si vous utilisiez phpMyAdmin depuis le paquet Debian, vous remarquerez que la suppression de PHP 5 entraine la suppression de PMA que c'en est une des dépendances.

Vous avez donc plusieurs choix :

  • Garder PHP 5 et ne pas partir à l'aventure
  • Utiliser MySQL uniquement en CLI
  • Installer PMA depuis l'archive présente sur le site
  • Utiliser un phpMyAdmin plus léger : Adminer

Pour ma part j'ai choisi Adminer, qui est bien plus pratique à configurer que l'archive de PMA, puisqu'il ne se compose d'un seul fichier PHP :D

Par ailleurs, Adminer est également présent sous la forme d'un paquet dans les dépôts Debian, mais il présente le même problème de dépendances que phpMyAdmin.

Performances face à HHVM

HHVM est un logiciel développé par Facebook renommé pour sa rapidité à exécuter le PHP, bien plus rapide que PHP 5.x. PHP 7 étant axé performances, les 2 sont au coude à coude depuis la sortie des premières RC de PHP 7.

Kinsta.com a fait un comparatif sur différents CMS du nombre de requêtes par seconde maximum en utilisant alternativement PHP 7 et HHVM.

Installer PHP 7 sous Debian Jessie via le dépôt Dotdeb
PHP 7 est 3x fois plus rapide que PHP 5.6 ici.
Installer PHP 7 sous Debian Jessie via le dépôt Dotdeb
On remarque l'importance de l'utilisation de OPcache
HHVM se démarque largement, et PHP ne présente que peu d'évolution
PHP 7 avec OPcache en tête

Conclusion : Les performances de chaque moteur d'exécution ne sont pas universelles mais relatives au code. Sur du code optimisé pour PHP 7 (Lavarel), celui-ci se place en tête. Sur du Drupal, PHP 5.6 et 7 sont aussi rapides.

De manière générale, on voit que PHP 7 a grandement rattrapé son retard sur HHVM, et que cela est principalement dû à l'utilisation d'OPcache.

Verdict

Après quelques jours de questionnement et de tests, notamment sur la compatibilité avec mes différents services et la problématique de phpMyAdmin, j'ai décidé de remplacer ma cohabitation PHP 5.6 / HHVM par l'utilisation de PHP 7 uniquement.

En effet PHP 7 est vraiment plus rapide, et cela se ressent sur WordPress, j'ai donc jugé inutile de garder HHVM, d'autant plus que celui-ci consomme plus de mémoire vive que PHP-FPM.

La rivalité entre les deux ne peut qu'être positive pour nos sites web ! :)

37 commentaires

  1. Gilles
    Je ne vois pas trop la différence avec mon blog D'un autre côté, j'ai la fibre donc bon... je ne vois pas ce que ça fait.
    0
    1. Stanislas
      Si ton blog est déjà rapide de base tu ne verra peut-être pas la différence ;) Après je suis + habitué à utiliser HHVM que PHP 5, mais je peut t'assurer que c'est plus rapide :)
      0
  2. Yax
    Est-ce que tu sais si PHP 7 est 100% compatible ascendant avec PHP 5 ? Ou bien y-a-t'il une liste de compatibilité avec les applications majeures quelque part ? Je pense à migrer Owncloud et Roundcube vers PHP 7...
    0
    1. Stanislas
      Il y a certains changements, notamment avec des fonctions dépréciées. Si le code est récent, généralement ça passe. D'après ce que j'ai vu sur GitHub, ownCloud fonctionne avec PHP 7, pour Roundcube je ne sais pas. Plus qu'à tester :)
      0
  3. Franck
    Merci beaucoup pour ce tuto ! Je voulais essayer en passant par Wamp qui propose une solution aussi, mais au moins comme ça je reste sur ma distrib Linux préférée ;-)
    0
    1. Stanislas
      De rien :D
      0
  4. bouguis
    salut est ce ces lignes de commandes sont valable pour Ubuntu 14.04
    0
    1. Stanislas
      Non malheureusement comme tu peux le voir sur le site de Dotdeb : uniquement pour Debian 6, 7 et 8.
      0
      1. bouguis
        Merci !!!
        0
  5. neo
    Salut merci pour le tuto. Tu pourras faire une mise à jours de ce tuto une fois que les extensions redis xdebug et memcache seront mises à jours? merci encore
    0
  6. Julien Doclot
    Y'a encore quelques problèmes avec php7. Notamment pour owncloud ou le WebDAV et caldav et cardav deconne. Retour en 5.6
    0
  7. anon
    Juste pour info, je viens de tester le tuto sur Raspberry Pi 2 (OS: Raspbian Jessie). apt-get update retourne
    W: Failed to fetch http://packages.dotdeb.org/dists/jessie/InRelease Unable to find expected entry 'all/binary-armhf/Packages' in Release file (Wrong sources.list entry or malformed file)
    Tandis que apt-get install php7.0 php7.0-fpm php7.0-mysql php7.0-curl php7.0-json php7.0-gd php7.0-mcrypt retourne :
    E: Unable to locate package php7.0 E: Couldn't find any package by regex 'php7.0' E: Unable to locate package php7.0-fpm E: Couldn't find any package by regex 'php7.0-fpm' E: Unable to locate package [...]
    Merci pour le tuto ;) Quelqu'un sait-il quand php7 sera officiellement dispo dans les packages debian/ubuntu sans devoir ajouter de repo?
    0
    1. Stanislas
      Salut, c'est tout à fait normal, Dotdeb ne contient pas les paquets pour l'architecture ARM (uniquement x86 et x64), il faut donc passer par la case compilation à l'heure actuelle. Je suppose que PHP 7 sera présent dans Debian 9 et dans Ubuntu 16.10. :)
      0
      1. anon
        merci pour la réponse Angristan :) Enfaîte je suis tombé sur ton article en cherchant sur google "php7 raspberry pi" ^^ Si jamais, par le plus grand des hasards, tu drop les dates de sorties sur les distro principales et sur notre chers raspberry pi, n'hésite pas a partager je t'en serai reconnaissant :)
        0
  8. Macha
    J'ai installé Apache 2 avant d'installer PHP 7 via ton tutoriel, mais lorsque je créé mon index.php avec , ça m'affiche en clair, PHP n'est pas traité... Dois-je faire l'inverse ? PHP 7 avant Apache 2 ?
    0
    1. Macha
      En fait, non, j'ai reinstallé mon serveur et installé Apache 2.x puis PHP 7.x et ça fonctionne parfaitement. Pensez juste à rajouter : libapache2-mod-php7.0
      0
      1. Stanislas
        Merci de l'info ! Je n'utilise plus Apache donc je ne m'en suis pas rendu compte... Je rajoute ça. :)
        0
  9. Zéfling
    Sympa comme tuto, ça fonctionne bien, sauf pear qui est complètement à l'ouest. Les « &new » et certaines fonctions obsolètes supprimées font que cela ne fonctionne plus (Debian 8.3). Un peu gênant.
    0
  10. Jeff
    Bonjour à tous, Merci pour ce tuto, cependant je rencontre une erreur lors de l'installation: Les paquets suivants contiennent des dépendances non satisfaites : php7.0-gd : Dépend: libjpeg62-turbo (>= 1.3.1) mais il n'est pas installable php7.0-intl : Dépend: libicu52 (>= 52~m1-1~) mais il n'est pas installable php7.0-zip : Dépend: libzip2 (>= 0.11.2) mais il n'est pas installable E: Impossible de corriger les problèmes, des paquets défectueux sont en mode « garder en l'état ». Avez vous une idée du problème ? Merci d'avance.
    0
    1. Jeff
      Distributor ID: Ubuntu Description: Ubuntu 16.04 LTS Release: 16.04 Codename: xenial
      0
      1. Stanislas
        Bonjour, regarde le titre : ce tutoriel est fait pour Debian 8 et non pour Ubuntu :)
        0
  11. Philippe
    Bonjour Je cherche à installer un serveur virtuel debian8 avec php7 sur un matériel VMWare n'ayant pas accès à internet (réseau interne sécurisé vers l'extérieur par un proxy/parefeu) Est il possible d'installer PHP7 sans passer par le repositery (comme debian avec les fichiers iso sur clé USB)? Merci
    0
      1. Booteille
        Il est aussi possible de télécharger un package à partir d'un autre ordinateur sous linux via la commande "apt download". Par example "apt download php" va télécharger le paquet php et toutes ses dépendances.
        0
  12. henri
    Bonjour J'ai suivi ton tuto une php installé sur le serveur (debian8/apache) il télécharge les pages en php au lieu de les afficher j'ai du louper un truc mais je ne sais pas quoi? Une idée peut être? Merci par avance
    0
    1. Stanislas
      Ça veut dire que le module PHP n'est pas activé. Que te donne apache2ctl -M ?
      0
      1. henri
        voici le résultat Loaded Modules: (...) php7_module (shared) (...)
        0
        1. Stanislas
          Tu as redémarré Apache ?
          0
          1. henri
            yep j'ai aussi changé cela dans la conf du domain FCGIWrapper /home/domain/fcgi-bin/php7.0.fcgi .php
            0
            1. Stanislas
              Tu as vérifié les permissions de tes fichiers PHP ?
              0
              1. henri
                Ah non même pour une migration je dois revérifier cela? Si oui peux tu me dire comment faire svp ;)
                0
                1. Stanislas
                  ls -l /ton/dossier/web
                  0
  13. f4b1
    Salut, j'ai vu que dotdeb ne serait dorénavant plus mis à jour, c'est grave docteur ? Des idées d'alternatives pour passer facilement à PHP 7.1 ?
    0
  14. David
    Hello, PHP7, c'est de la bombe. Par contre, impossible de virer la limitation des upload de 2M. J'ai beau modifier les valeurs dans /etc/php/7.0/apache2/php.ini et /etc/php/7.0/cli/php.ini, rien n'y fait. Wordpress reste bloqué sur 2M. (Serveur interne Ubuntu 16.04). Si quelqu'un a une idée...
    0
    1. Stanislas
      Tu utilises Apache ou Nginx ?
      0
  15. F277
    Bonjour, Je suis bloqué au moment de passer la commande d'installation de php7 j'ai les erreurs suivantes : root@house:/home/pi# apt install php7.0 php7.0-fpm php7.0-mysql php7.0-curl php7.0-json php7.0-gd php7.0-mcrypt php7.0-msgpack php7.0-memcached php7.0-intl php7.0-sqlite3 php7.0-gmp php7.0-geoip php7.0-mbstring php7.0-xml php7.0-zip Lecture des listes de paquets... Fait Construction de l'arbre des dépendances Lecture des informations d'état... Fait E: Impossible de trouver le paquet php7.0 E: Impossible de trouver de paquet correspondant à l'expression rationnelle « php7.0 » E: Impossible de trouver le paquet php7.0-fpm E: Impossible de trouver de paquet correspondant à l'expression rationnelle « php7.0-fpm » E: Impossible de trouver le paquet php7.0-mysql E: Impossible de trouver de paquet correspondant à l'expression rationnelle « php7.0-mysql » E: Impossible de trouver le paquet php7.0-curl E: Impossible de trouver de paquet correspondant à l'expression rationnelle « php7.0-curl » E: Impossible de trouver le paquet php7.0-json E: Impossible de trouver de paquet correspondant à l'expression rationnelle « php7.0-json » E: Impossible de trouver le paquet php7.0-gd E: Impossible de trouver de paquet correspondant à l'expression rationnelle « php7.0-gd » E: Impossible de trouver le paquet php7.0-mcrypt E: Impossible de trouver de paquet correspondant à l'expression rationnelle « php7.0-mcrypt » E: Impossible de trouver le paquet php7.0-msgpack E: Impossible de trouver de paquet correspondant à l'expression rationnelle « php7.0-msgpack » E: Impossible de trouver le paquet php7.0-memcached E: Impossible de trouver de paquet correspondant à l'expression rationnelle « php7.0-memcached » E: Impossible de trouver le paquet php7.0-intl E: Impossible de trouver de paquet correspondant à l'expression rationnelle « php7.0-intl » E: Impossible de trouver le paquet php7.0-sqlite3 E: Impossible de trouver de paquet correspondant à l'expression rationnelle « php7.0-sqlite3 » E: Impossible de trouver le paquet php7.0-gmp E: Impossible de trouver de paquet correspondant à l'expression rationnelle « php7.0-gmp » E: Impossible de trouver le paquet php7.0-geoip E: Impossible de trouver de paquet correspondant à l'expression rationnelle « php7.0-geoip » E: Impossible de trouver le paquet php7.0-mbstring E: Impossible de trouver de paquet correspondant à l'expression rationnelle « php7.0-mbstring » E: Impossible de trouver le paquet php7.0-xml E: Impossible de trouver de paquet correspondant à l'expression rationnelle « php7.0-xml » E: Impossible de trouver le paquet php7.0-zip E: Impossible de trouver de paquet correspondant à l'expression rationnelle « php7.0-zip » root@house:/home/pi# Merci de votre aide
    0

Laisser un commentaire