Comment installer PHP7 (PHP-FPM & FastCGI) pour ISPConfig 3 sur Debian 7 et 8

Publié le 21/08/2015

La première version bêta de PHP 7 est maintenant disponible pour le téléchargement et est jusqu’à 2 fois plus rapide que PHP 5.6 et 14 fois plus rapide que PHP 5.0 selon les journaux de version. Cette nouvelle version est de plus 100 % compatible avec PHP 5.x. Cependant, certaines API obsolètes ont été retirées. Cela peut donc être une bonne idée de tester la compatibilité de vos sites avec cette nouvelle version. Vous pouvez le faire facilement et sans affecter les sites actuellement installés sur votre serveur en utilisant la fonction multi-version PHP d’ISPConfig 3. Cette version peut ensuite être sélectionnée dans les paramètres de vos sites web d’ISPConfig 3 individuellement pour chaque site. Elle fonctionne avec les modes PHP-FPM et FastCGI. Ce tutoriel explique comment compiler PHP 7 (Beta) avec le mode PHP-FPM ainsi que la version FastCGI sur un serveur Debian Jessie. Ces builds incluent Zend OPcache.

Note préliminaire

Je vais installer PHP 7 qui est actuellement en version bêta au moment où j’écris ces lignes. Veuillez noter que PHP-FPM peut-être utilisé à la fois sur un serveur web Apache2 et nginx tandis que FastCGI n’est disponible que pour le serveur web Apache2.

Avec les anciennes versions de PHP, PHP-FPM et FastCGI avaient été mutuellement réservés en mode binaire de sorte qu’ils pouvaient être compilés séparément. Avec PHP 7, les deux binaires peuvent être compilés ensemble et donc nous ne devrons faire qu’une seule compilation PHP.

Compiler PHP 7 avec PHP-FPM et FastCGI

Téléchargez et extrayez PHP 7 :

mkdir -p /opt/php-7.0.0
mkdir /usr/local/src/php5-build
cd /usr/local/src/php5-build
wget https://downloads.php.net/~ab/php-7.0.0beta1.tar.bz2 -O php-7.0.0.tar.bz2
tar jxf php-7.0.0.tar.bz2
cd php-7.0.0beta1/

Installez les pré-requis pour compiler PHP 7 et un éditeur en ligne de commande pour éditer les fichiers de configuration :

apt-get install build-essential vim
apt-get install libfcgi-dev libfcgi0ldbl libjpeg62-turbo-dbg libmcrypt-dev libssl-dev libc-client2007e libc-client2007e-dev libxml2-dev libbz2-dev libcurl4-openssl-dev libjpeg-dev libpng12-dev libfreetype6-dev libkrb5-dev libpq-dev libxml2-dev libxslt1-dev
ln -s /usr/lib/libc-client.a /usr/lib/x86_64-linux-gnu/libc-client.a

Cette dernière commande est requise si vous compilez PHP avec –with-imap, sinon l’exécution de ./configure s’arrêtera avec l’erreur suivante :

checking for crypt in -lcrypt... yes
configure : error : Cannot find imap library (libc-client.a). Please check your c-client installation.
root@server1 :/usr/local/src/php5-build/php-7.0.0#

Configurez et compilez PHP 7.0.0 comme suit (vous pouvez ajuster la commande ./configure en fonction de vos besoins, jeter un coup d’œil à la commande ./configure –help pour voir toutes les options disponibles ; si vous utilisez une commande ./configure différente, il est possible que vous ayez besoin de bibliothèques additionnelles sinon le processus de compilation pourrait être en échec) :

./configure --prefix=/opt/php-7.0.0 --with-pdo-pgsql --with-zlib-dir --with-freetype-dir --enable-mbstring --with-libxml-dir=/usr --enable-soap --enable-calendar --with-curl --with-mcrypt --with-zlib --with-gd --with-pgsql --disable-rpath --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --enable-exif --enable-bcmath --with-mhash --enable-zip --with-pcre-regex --with-mysqli --with-pdo-mysql --with-mysqli --with-jpeg-dir=/usr --with-png-dir=/usr --enable-gd-native-ttf --with-openssl --with-fpm-user=www-data --with-fpm-group=www-data --with-libdir=/lib/x86_64-linux-gnu --enable-ftp --with-imap --with-imap-ssl --with-kerberos --with-gettext --with-xmlrpc --with-xsl --enable-opcache --enable-fpm

Le dernier argument (–enable-fpm) permet d’assurer le fonctionnement de PHP avec le mode PHP-FPM.

make
make install

Copiez php.ini et php-fpm.conf aux bons endroits :

cp /usr/local/src/php5-build/php-7.0.0beta1/php.ini-production /opt/php-7.0.0/lib/php.ini
cp /opt/php-7.0.0/etc/php-fpm.conf.default /opt/php-7.0.0/etc/php-fpm.conf
cp /opt/php-7.0.0/etc/php-fpm.d/www.conf.default /opt/php-7.0.0/etc/php-fpm.d/www.conf

Ouvrez /opt/php-7.0.0/etc/php-fpm.conf et ajustez le paramètre suivant (supprimez le # devant la ligne de pid) :

vim /opt/php-7.0.0/etc/php-fpm.conf
[...]
pid = run/php-fpm.pid
[...]

Puis ouvrez /opt/php-7.0.0/etc/php-fpm.conf et ajustez la ligne d’écoute listen, vous devez utiliser un port non utilisé (par exemple le port 8999 ; le port 9000 pourrait être utilisé par défaut pour le PHP-FPM de Debian) :

vim /opt/php-7.0.0/etc/php-fpm.d/www.conf
[...]
listen = 127.0.0.1:8999
[...]

La nouvelle version de Debian supporte Systemd ainsi que les scripts d’initialisation traditionnels. On va d’abord créer un script d’initiation pour le service PHP-FPM puis nous créerons une unité pour Systemd. Donc, créez le script d’initialisation pour PHP-FPM :

nano /etc/init.d/php-7.0.0-fpm
# ! /bin/sh
### BEGIN INIT INFO
# Provides :          php-7.0.0-fpm
# Required-Start :    $all
# Required-Stop :     $all
# Default-Start :     2 3 4 5
# Default-Stop :      0 1 6
# Short-Description : starts php-7.0.0-fpm
# Description :       starts the PHP FastCGI Process Manager daemon
### END INIT INFO
php_fpm_BIN=/opt/php-7.0.0/sbin/php-fpm
php_fpm_CONF=/opt/php-7.0.0/etc/php-fpm.conf
php_fpm_PID=/opt/php-7.0.0/var/run/php-fpm.pid
php_opts="--fpm-config $php_fpm_CONF"
wait_for_pid () {
        try=0
        while test $try -lt 35 ; do
                case "$1" in
                        'created')
                        if [ -f "$2" ] ; then
                                try=''
                                break
                        fi
                        ; ;
                        'removed')
                        if [ ! -f "$2" ] ; then
                                try=''
                                break
                        fi
                        ; ;
                esac
                echo -n .
                try=`expr $try + 1`
                sleep 1
        done
}
case "$1" in
        start)
                echo -n "Starting php-fpm "
                $php_fpm_BIN $php_opts
                if [ "$?" != 0 ] ; then
                        echo " failed"
                        exit 1
                fi
                wait_for_pid created $php_fpm_PID
                if [ -n "$try" ] ; then
                        echo " failed"
                        exit 1
                else
                        echo " done"
                fi
        ; ;
        stop)
                echo -n "Gracefully shutting down php-fpm "
                if [ ! -r $php_fpm_PID ] ; then
                        echo "warning, no pid file found - php-fpm is not running ?"
                        exit 1
                fi
                kill -QUIT `cat $php_fpm_PID`
                wait_for_pid removed $php_fpm_PID
                if [ -n "$try" ] ; then
                        echo " failed. Use force-exit"
                        exit 1
                else
                        echo " done"
                       echo " done"
                fi
        ; ;
        force-quit)
                echo -n "Terminating php-fpm "
                if [ ! -r $php_fpm_PID ] ; then
                        echo "warning, no pid file found - php-fpm is not running ?"
                        exit 1
                fi
                kill -TERM `cat $php_fpm_PID`
                wait_for_pid removed $php_fpm_PID
                if [ -n "$try" ] ; then
                        echo " failed"
                        exit 1
                else
                        echo " done"
                fi
        ; ;
        restart)
                $0 stop
                $0 start
        ; ;
        reload)
                echo -n "Reload service php-fpm "
                if [ ! -r $php_fpm_PID ] ; then
                        echo "warning, no pid file found - php-fpm is not running ?"
                        exit 1
                fi
                kill -USR2 `cat $php_fpm_PID`
                echo " done"
        ; ;
        *)
                echo "Usage : $0 {start|stop|force-quit|restart|reload}"
                exit 1
        ; ;
esac

Créez le script d’initialisation exécutable et ajoutez les liens au démarrage du système :

chmod 755 /etc/init.d/php-7.0.0-fpm
insserv php-7.0.0-fpm

Et créez maintenant le fichier d’unité pour Systemd (si vous utilisez une version antérieure à Debian Jessie, passez cette étape) :

nano /lib/systemd/system/php-7.0.0-fpm.service
[Unit]
Description=The PHP 7 FastCGI Process Manager
After=network.target
 
[Service]
Type=simple
PIDFile=/opt/php-7.0.0/var/run/php-fpm.pid
ExecStart=/opt/php-7.0.0/sbin/php-fpm --nodaemonize --fpm-config /opt/php-7.0.0/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
 
[Install]
WantedBy=multi-user.target
systemctl daemon-reload

Finalement, lancez PHP-FPM …

Pour les serveurs utilisant le système d’initialisation traditionnel, exécutez :

/etc/init.d/php-7.0.0-fpm start

Le résultat devrait être :

/etc/init.d/php-7.0.0-fpm start
Starting php-fpm done

Sur les serveurs utilisant Systemd, utilisez plutôt cette ligne de commande :

systemctl start php-7.0.0-fpm.service

Pour activer l’option Zend OPcache, ouvrez /opt/php-7.0.0/lib/php.ini …

vim /opt/php-7.0.0/lib/php.ini

… et ajoutez la ligne suivante à la fin du fichier :

[...]
zend_extension=opcache.so

Le memcache et l’extension APCu ne peuvent pas encore être installés sur PHP 7, nous allons donc sauter leur installation pour le moment.

Activer PHP 7 sur ISPConfig

Sur ISPConfig 3, vous pouvez configurer une nouvelle version de PHP dans « Système > Additional PHP Versions« . Sous l’onglet « Name« , il vous suffit de remplir un nom pour la version PHP (exemple : PHP 7.0.0). Cette version PHP sera répertoriée sous ce nom dans les paramètres du site ISPConfig :

Allez sur l’onglet « FastCGI Settings » et remplissez les champs comme suit :

Path to the PHP FastCGI binary : /opt/php-7.0.0/bin/php-cgi
Path to the php.ini directory : /opt/php-7.0.0/lib

Puis allez sur l’onglet « PHP-FPM Settings » et remplissez les champs comme suit :

Path to the PHP-FPM init script : /etc/init.d/php-7.0.0-fpm
Path to the php.ini directory : /opt/php-7.0.0/lib
Path to the PHP-FPM pool directory : /opt/php-7.0.0/etc/php-fpm.d

Liens

Source en anglais : howtoforge.com