Les articles sur Php7 ne cessent de culpabiliser les développeurs sous php5.x .. , il est plus .. performant, rapide, des nouvelles fonctionnalités qui se rapprochent de python ( ok ... ça c'est un troll ), il est ... bref .. il faut le tester pour se faire une idée, et surtout vérifier si les projets tournent dessus dans devoir faire face à une horde de logs de type Notice , Deprecated, ou encore pire .. Fatal Error
On fait quoi
Vous avez de beaux projets qui tournent sous une version de Php stable 5.X et .. malgré l'adage .. on ne change pas quelque chose qui marche, vous trépigniez d'impatience de voir ce qu'ils donnent avec la dernière monture de la société Zend .
Ok .. mais sans tout casser s'il vous plait.
On va donc voir comment installer ( par compilation ) php7 afin de pouvoir l'utiliser (ou pas) projet par projet. Ou plutôt vhost par vhost .
Installer PHP7
J'ai pris comme base, un serveur tout neuf .. à poil .. Debian Jessie sur la plateforme Google.
Commençons par installer quelques paquets nécessaires pour le bon déroulement de cet article ( et de la compilation de php ).
sudo apt install vim bzip2 build-essential libxml2-dev libc-client-dev libbz2-dev libkrb5-dev libmcrypt-dev librecode-dev
Puis classiquement nous téléchargeons les sources de php
cd /usr/local/src wget http://us2.php.net/distributions/php-7.0.2.tar.bz2 tar xjf php-7.0.2.tar.bz2 cd php-7.0.2
Nous allons créer un petit fichier de config pour notre version de php ( activer ou pas certains modules, définir l'emplacement de php... )
vim myConfig
Voici le contenu ( nous allons l'installer dans /usr/local/php7 )
#!/bin/sh mkdir -p /usr/local/php7 export OPTIM=-02 ./configure --prefix=/usr/local/php7 \ --enable-fpm \ --with-xsl \ --with-gettext \ --enable-mbstring \ --enable-mbregex \ --disable-debug \ --enable-ftp \ --with-mcrypt \ --enable-zip \ --enable-calendar \ --enable-exif \ --with-pdo-mysql \ --with-gettext \ --with-zlib \ --with-bz2 \ --enable-inline-optimization \ --enable-pcntl \ --enable-opcache \ --with-mysqli \ --with-zlib \ --with-jpeg-dir \ --with-gd \ --with-freetype-dir=DIR \ --with-imap-ssl \ --with-imap \ --with-curl \ --enable-bcmath \ --with-kerberos \ --enable-sysvsem \ --enable-sysvshm \ --enable-sockets \ --enable-gd-native-ttf \ --with-openssl \
Rendons ce script exécutable et ... c'est parti
chmod +x myConfig ./myConfig
Si tout ce passe bien, nous pouvons lancer les deux dernières commandes pour installer php7
make -j `cat /proc/cpuinfo | grep processor | wc -l` sudo make install
Configuration
Et bien oui .. vous ne passez pas par les paquets de la distrib .. vous avez donc un poil plus de boulot . Commençons par récupérer le configuration par défaut ( vous 'adapterez au besoin plus tard, ce point sort du cadre de cet article )
cd /usr/local/php7/etc/ cp php-fpm.conf.default php-fpm.conf
Malgré tout, vérifiez bien à dé-commenter la ligne suivante ( vous verrez plus tard pourquoi )
pid = run/php7-fpm.pid
Pools
Enfin il nous faut également créer le pool par défaut de php-fpm
cd php-fpm.d cp www.conf.default www.conf
Idem il nous faut dé-commencter/éditer/modifier deux trois lignes ( vous pouvez reprendre les valeurs ci-dessous, si vous avez une installation de base . Notamment pour l'utilisateur utilisé pour interpréter vos scripts php )
user = www-data group = www-data listen = /var/run/php7-fpm.sock listen.owner = www-data listen.group = www-data listen.mode = 0660
php.ini
Aller .. encore un fichier de config à gérer.
On va prendre la version "prod" disponible dans les sources que nous avons téléchargées .
cp /usr/local/src/php-7.0.2/php.ini-production /usr/local/php7/lib/php.ini
Ajoutons le module opcache dans la foulé
vim /usr/local/lib/php.ini
Ajouter en fin de fichier
zend_extension=opcache.so
Ready ! ? ... non pas encore
Lancer php-fpm au démarrage
Commençons par créer notre fichier d'init ( modèle dispo dans les sources également. Je précise ce point car certains articles semblent sortir ces scripts de leur chapeau, sans explication ! )
Les modèles se trouvent dans : /usr/local/src/php-7.0.2/sapi/fpm
vim /etc/init.d/php7-fpm
Le contenu :
#! /bin/sh ### BEGIN INIT INFO # Provides: php7-fpm # Required-Start: $all # Required-Stop: $all # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: starts php7-fpm # Description: starts the PHP FastCGI Process Manager daemon ### END INIT INFO php_fpm_BIN=/usr/local/php7/sbin/php-fpm php_fpm_CONF=/usr/local/php7/etc/php-fpm.conf php_fpm_PID=/usr/local/php7/var/run/php7-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
On le rend exécutable et crée les liens de démarrage
sudo chmod 755 /etc/init.d/php7-fpm insserv php7-fpm
Puis on crée le fichier pour initd
vim /lib/systemd/system/php7-fpm.service
Voici le contenu
[Unit] Description=The PHP 7 FastCGI Process Manager After=network.target [Service] Type=simple PIDFile=/usr/local/php7/var/run/php7-fpm.pid ExecStart=/usr/local/php7/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php7/etc/php-fpm.conf ExecReload=/bin/kill -USR2 $MAINPID [Install] WantedBy=multi-user.target
On active le service
systemctl enable php7-fpm.service systemctl daemon-reload systemctl enable php7-fpm
On lance ENFIN php7-fpm
service php7-fpm start
Petit check
ps -xa | grep php-fpm
qui doit donner un truc du genre:
861 ? Ss 0:00 php-fpm: master process (/usr/local/php5/etc/php-fpm.conf) 862 ? S 0:00 php-fpm: pool www 863 ? S 0:00 php-fpm: pool www
Et voilà, vous avez la toute dernière monture de php disponible .
Ok mais ... comment l'utiliser dans le vhost.
Nginx
Installons rapidement Nginx
sudo apt-get install nginx
éditons le vhost par défaut pour prendre en compte notre installation de php
vim /etc/nginx/sites-enabled/default
Et on dé-commente pour avoir ceci
location ~ \.php$ { include snippets/fastcgi-php.conf; # # # With php5-cgi alone: # fastcgi_pass 127.0.0.1:9000; # # With php5-fpm: fastcgi_pass unix:/var/run/php7-fpm.sock; }
On demande à Nginx de passer les requêtes pointant les fichiers php au socket : /var/run/php7-fpm.sock
Test
Un rapide script de test ...LE phpinfo()
vim /var/www/html/test.php
Puis on colle le code suivant
<?php echo phpinfo();
Rendez-vous sur l'url de votre serveur http://x.x.x.x/test.php
Et là ... victoire ..
Conclusion
Vous avez compris comment ajouter une version de php à votre serveur ( en plus de la version des dépôts ). Vous pouvez comme celà installer n'importe quelle version de php et utiliser l'une ou l'autre au besoin, en spécifiant le bon socket dans votre vhost .
N'hésitez pas à laisser un commentaire si vous avez des questions .
Bonne nuit.