--- categories: web title: Howto PHP ... * Documentation : * Rôle Ansible : [PHP](http://php.net/) est un langage de programmation populaire pour le développement web. PHP peut s'utiliser en CLI (ligne de commande), via mod_php (module intégré à [Apache](HowtoApache)) ou via FPM (FastCGI Process Manager). ## Installation ~~~ # apt install php-cli php-curl php-mysql php-pgsql php-mcrypt php-ldap php-imap php-gd php-ssh2 php-gettext composer $ php -v PHP 7.0.19-1 (cli) (built: May 11 2017 14:04:47) ( NTS ) Copyright (c) 1997-2017 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies with Zend OPcache v7.0.19-1, Copyright (c) 1999-2017, by Zend Technologies $ composer -V Composer version 1.2.2 2016-11-03 17:43:15 ~~~ > *Note* : Pour Debian 8, on a PHP 5.6 qu'il faut installer ainsi (et il n'y a pas de package pour _composer_) : > > ~~~ > # apt install php5-cli php5-curl php5-mysql php5-pgsql php5-mcrypt php5-ldap php5-imap php5-gd php5-ssh2 php-gettext > ~~~ ### PHP-FPM PHP-FPM (FastCGI Process Manager) est une façon alternative d'utiliser PHP avec [Apache](HowtoApache) ou [Nginx](HowtoNginx). ~~~ # apt install php-fpm # systemctl status php7.0-fpm ● php7.0-fpm.service - The PHP 7.0 FastCGI Process Manager Loaded: loaded (/lib/systemd/system/php7.0-fpm.service; enabled; vendor preset: enabled) Docs: man:php-fpm7.0(8) Main PID: 1516 (php-fpm7.0) Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec" CGroup: /system.slice/php7.0-fpm.service ├─1516 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf) ├─1517 php-fpm: pool www └─1518 php-fpm: pool www ~~~ > *Note* : Pour Debian 8, il faut installer ainsi : > > ~~~ > # apt install php5-fpm > ~~~ ### mod_php ~~~ # apt install libapache2-mod-php ~~~ > *Note* : Pour Debian 8, il faut installer ainsi : > > ~~~ > # apt install libapache2-mod-php5 > ~~~ ## Configuration Fichiers de configuration : ~~~ /etc/php/7.0/ ├── apache2 │   ├── conf.d │   │   ├── [...] │   │   └── 20-xsl.ini -> /etc/php/7.0/mods-available/xsl.ini │   └── php.ini ├── cli │   ├── conf.d │   │   ├── [...] │   │   └── 20-xsl.ini -> /etc/php/7.0/mods-available/xsl.ini │   └── php.ini ├── fpm │   ├── conf.d │   │   ├── [...] │   │   └── 20-xsl.ini -> /etc/php/7.0/mods-available/xsl.ini │   ├── php-fpm.conf │   ├── php.ini │   └── pool.d │   └── www.conf └── mods-available ├── [...] └── xsl.ini ~~~ ### Configuration de base (php.ini) Il existe un fichier `php.ini` distinct suivant l’utilisation de PHP : cli, mod_php et FPM. Par exemple `/etc/php/7.0/fpm/php.ini` pour FPM. Le fichier `/etc/php/7.0/fpm/conf.d/z-evolinux-defaults.ini` contient nos optimisations basiques : ~~~ short_open_tag = Off expose_php = Off display_errors = Off log_errors = On html_errors = Off allow_url_fopen = Off memory_limit = 128M max_execution_time = 10 open_basedir = /home disable_functions = exec, shell-exec, system, passthru, putenv, popen ~~~ ### Configuration FPM Voici les directives de base : ~~~ [global] pid = /run/php5-fpm.pid error_log = /var/log/php5-fpm.log ~~~ On définit ensuite un ou plusieurs *pools* FPM via `/etc/php5/fpm/pool.d/*.conf` : ~~~ [www] listen = /var/run/php5-fpm.sock ;listen = 127.0.0.1:9000 user = www-data group = www-data pm = dynamic php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f return-path@example.com php_flag[display_errors] = off php_admin_value[error_log] = /var/log/fpm-php.www.log php_admin_flag[log_errors] = on php_admin_value[memory_limit] = 32M ~~~ L'option **pm** (process manager) permet de choisir comment seront contrôlés les process fils : static, ondemand ou dynamic. Le mode standard est **dynamic** : FPM va préparer des process en attente (au minimum 1) et les faire varier en fonction de la demande (de façon similaire à ce que peut faire [Apache](HowtoApache#configuration-de-base)). ~~~ pm = dynamic pm.max_children = 100 pm.start_servers = 50 pm.min_spare_servers = 20 pm.max_spare_servers = 30 pm.max_requests = 100 ~~~ Avec de nombreux pools, on optera pour le mode **ondemand** qui ne prépare pas de process mais les crée à chaque demande. D'après nos tests, les performances restent (assez étonnament) tout à fait acceptables. ~~~ pm = ondemand pm.max_children = 100 pm.process_idle_timeout = 10s ~~~ D'autres options de FPM sont intéressantes : ~~~ slowlog = log/$pool.log.slow request_slowlog_timeout = 5s pm.status_path = /fpm-status request_terminate_timeout = 60s chroot = /home/foo access.log = log/$pool.access.log ~~~ #### Configuration FPM avec Nginx On configure PHP-FPM avec Nginx, par exemple dans un Virtualhost : ~~~ server { listen 80; server_name www.example.com example.com; root /home/foo/www; index index.php; location ~ \.php$ { try_files $uri =404; #fastcgi_pass 127.0.0.1:9000; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_param SCRIPT_FILENAME /home/foo/www$fastcgi_script_name; include fastcgi_params; } } ~~~ #### Configuration FPM avec Apache Cela nécessite le module proxy_fcgi : ~~~ # a2enmod proxy_fcgi Considering dependency proxy for proxy_fcgi: Enabling module proxy. Enabling module proxy_fcgi. ~~~ On configure PHP-FPM avec Apache, par exemple dans un VirtualHost : ~~~{.apache} DocumentRoot /home/bench/www/ #ProxyPassMatch "^/(.*\.php(/.*)?)$" "fcgi://127.0.0.1:9000//home/foo/www/$1" ProxyPassMatch "^/(.*\.php(/.*)?)$" "unix:/var/run/php5-fpm.sock|fcgi://localhost/home/foo/www/" ~~~