wiki/HowtoPHP.md

462 lines
13 KiB
Markdown
Raw Normal View History

---
categories: web
title: Howto PHP
...
* Documentation : <http://php.net/manual/en/>
* Rôle Ansible : <https://forge.evolix.org/projects/ansible-roles/repository/show/php>
[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).
2017-09-08 03:46:31 +02:00
Il existe [plusieurs versions de PHP](http://php.net/supported-versions.php).
Voici les versions de PHP actuellement supportées sous Debian :
* Debian 7 : PHP 5.4.45
* Debian 8 : PHP 5.6.19
* Debian 9 : PHP 7.0.10
## Installation
~~~
2017-08-22 23:32:44 +02:00
# apt install php php-cli php-curl php-mysql php-pgsql php-mcrypt php-ldap php-imap php-gd php-ssh2 php-gettext composer libphp-phpmailer
$ 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_) :
>
> ~~~
2017-08-22 23:32:44 +02:00
> # apt install php5 php5-cli php5-curl php5-mysql php5-pgsql php5-mcrypt php5-ldap php5-imap php5-gd php5-ssh2 php-gettext libphp-phpmailer
> ~~~
### 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
<http://php.net/manual/en/install.fpm.configuration.php>
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 lutilisation 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
2017-08-22 23:32:44 +02:00
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/"
~~~
2017-08-22 18:38:14 +02:00
2017-09-08 03:46:31 +02:00
### Configuration mod_php
Avec mod_php on peut forcer la plupart des options du php.ini dans la configuration Apache.
Par exemple, au sein d'un VirtualHost on peut mettre les paramètres suivants :
~~~
<VirtualHost *:80>
#php_admin_flag engine off
#AddType text/html .html
#php_admin_flag display_errors On
#php_flag short_open_tag On
#php_flag register_globals On
#php_admin_value memory_limit 256M
#php_admin_value max_execution_time 60
#php_admin_value upload_max_filesize 8M
#php_admin_flag allow_url_fopen Off
php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f www-XXX"
php_admin_value open_basedir "/usr/share/php:HOME_DIR/XXX:/tmp"
~~~
## Sessions PHP
<http://php.net/manual/en/book.session.php>
Lorsque des sessions PHP sont utilisées (fonctions session_*() dans le code), des informations sont stockées côté serveur.
Le navigateur conserve uniquement identifiant pour accéder à ces informations, stockés dans un cookie ou une variable du type PHPSESSID dans l'URL (cela tend à être obsolète).
Par défaut, ces informations sont conservées dans des fichiers sur le disque (un fichier par session) mais il est conseillé d'utiliser
une méthode plus performante si vous avez un serveur dédié. Évidemment il est EXCLU de stocker les sessions dans une base de données SQL
sauf si vous voulez payer cher pour avoir un site lent et tuer des bébés phoques.
* La plus simple si votre site web est en mono-serveur ou en mode sticky : monter le répertoire qui stocker les fichiers en *TMPFS*.
Cela se fait par exemple en ajoutant la ligne suivante dans votre _fstab_ :
~~~
tmpfs /var/lib/php5 tmpfs defaults,noexec,nosuid,nodev,size=256m 0 0
~~~
* Les sessions peuvent être stockées dans un ou plusieurs serveurs *Memcached* avec les paramètres suivants :
~~~
session.save_handler = memcached
session.save_path = "192.0.43.10:11211,192.0.43.11:11211"
~~~
Par contre, contrairement aux idées reçues, ce n'est pas conseillé. Memcached est fait pour "cacher" et non "stocker".
Voir le blog d'un développeur de Memcached à ce sujet : <http://dormando.livejournal.com/495593.html>
* Les sessions peuvent être stockées dans un ou plusieurs serveurs *Redis* avec les paramètres suivants :
~~~
session.save_handler = redis
session.save_path = "tcp://192.0.43.10:6379?auth=<password>,tcp://192.0.43.11:6379?auth=<password>"
~~~
* Les sessions peuvent être stockées dans [Sharedance](http://www.pureftpd.org/project/sharedance), un petit logiciel spécialement conçu pour
stocker les sessions PHP. Il n'est plus maintenu, mais très simple, il est toujours fonctionnel. Voici un exemple d'utilisation :
~~~
auto_prepend_file = /usr/local/etc/sharedance.php
;session.save_handler = user
;session.save_handler = files
~~~
* Les sessions peuvent être stockées dans *Tokyo Tyrant/Tycoon* avec les paramètres suivants :
~~~
tokyo_tyrant.session_salt="randomlongstring"
session.save_handler=tokyo_tyrant
session.save_path="tcp://192.0.43.10:1978,tcp://192.0.43.10:1978"
~~~
2017-08-22 23:32:44 +02:00
2017-08-22 18:38:14 +02:00
## Composer
* Documentation : <https://getcomposer.org/doc/>
[Composer](https://getcomposer.org/) est un outil moderne de gestion des bibliothèques PHP, qui tend à remplacer le vieil outil [PEAR](https://pear.php.net/). Il est disponible à partir de Debian 9.
Composer s'utilise sans les droits _root_.
Il s'appuye sur la présence d'un fichier `composer.json` qui déclare les bibliothèques à installer.
~~~
$ composer about
Composer - Package Management for PHP
Composer is a dependency manager tracking local dependencies of your projects and libraries.
See https://getcomposer.org/ for more information.
2017-09-06 15:43:19 +02:00
$ echo '{"require": {"twig/extensions": "~1.0"}}' > composer.json
2017-08-22 18:38:14 +02:00
$ composer update
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing symfony/polyfill-mbstring (v1.5.0)
Loading from cache
- Installing twig/twig (v2.4.3)
Loading from cache
- Installing twig/extensions (v1.5.1)
Loading from cache
twig/extensions suggests installing symfony/translation (Allow the time_diff output to be translated)
Writing lock file
Generating autoload files
$ composer show
symfony/polyfill-mbstring v1.5.0 Symfony polyfill for the Mbstring extension
twig/extensions v1.5.1 Common additional features for Twig that do not directly belong in core
twig/twig v2.4.3 Twig, the flexible, fast, and secure template language for PHP
~~~
### Composer sous Debian 8
~~~
$ wget https://getcomposer.org/installer
$ sha384sum installer
$ mkdir bin
$ php -d allow_url_fopen=On installer --install-dir=bin --filename=composer
$ php bin/composer --version
PHP Warning: putenv() has been disabled for security reasons
Composer version 1.5.1 2017-08-09 16:07:22
~~~
2017-08-22 23:32:44 +02:00
2017-09-08 03:52:45 +02:00
## Modules de paiement
### SPPlus
Pré-requis :
~~~
# apt install php5-dev
~~~
Attention à bien vérifier que `/tmp` n'est pas monté en noexec pour la suite.
Compilation du module :
~~~
$ cd /tmp
$ wget http://kits.spplus.net/integration/spplus/kits/spplus-1.2.tar.gz
$ tar xzf spplus-1.2.tar.gz
$ cd spplus-1.2
$ phpize
$ ./configure
$ make
# cp modules/php_spplus.so /usr/lib/php5/<builddate>/
# chmod 644 /usr/lib/php5/<builddate>/php_spplus.so
~~~
Ajouter un fichier `/etc/php5/mods-available/spplus.ini` :
~~~
extension=php_spplus.so
~~~
Puis activer la configuration :
~~~
# ln -s /etc/php5/mods-available/spplus.ini /etc/php5/cli/conf.d/30-spplus.ini
# ln -s /etc/php5/mods-available/spplus.ini /etc/php5/apache2/conf.d/30-spplus.ini
# systemctl reload apache2
~~~
2017-08-22 23:32:44 +02:00
2017-09-08 03:49:28 +02:00
## Module du framework phalcon
<https://docs.phalconphp.com/fr/latest/reference/install.html>
<https://github.com/phalcon/phalcon-devtools>
Installer les dépendances suivantes :
~~~
# apt install php5-dev libpcre3-dev gcc make php5-mysql
~~~
Cloner la dernière version stable (2.0.x à ce jour) :
~~~
$ git clone --depth=1 git://github.com/phalcon/cphalcon.git -b 2.0.x
~~~
Compiler et installer le module :
~~~
$ cd cphalcon/build
# ./install
~~~
Configurer PHP et Apache :
Ajouter un fichier `/etc/php5/mods-available/phalcon.ini` :
~~~
extension=phalcon.so
~~~
Puis activer la configuration :
~~~
# ln -s /etc/php5/mods-available/phalcon.ini /etc/php5/cli/conf.d/30-phalcon.ini
# ln -s /etc/php5/mods-available/phalcon.ini /etc/php5/apache2/conf.d/30-phalcon.ini
# systemctl reload apache2
~~~
Pour installer les phalcon devtools :
~~~
$ git clone https://github.com/phalcon/phalcon-devtools.git -b 2.0.x /opt/phalcon-devtools
# ln -s /opt/phalcon-devtools/phalcon.php /usr/local/bin/phalcon
# chmod ugo+x /usr/local/bin/phalcon
~~~
2017-09-08 03:46:31 +02:00
## FAQ
* J'ai un message d'erreur du type : _/usr/lib/php5/20090626/xcache.so doesn't appear to be a valid Zend extension_
Remplacer `zend_extension=` par `extension=` pour le chargement du module PHP.
* Certaines fonctions GD n'existent pas : imagerotate(), imageantialias(), etc.
Pour des raisons de sécurité et de maintenabilité, la version de PHP de Debian n'embarque par le GD modifié par PHP. Ces fonctions ne sont
pas disponibles. Pour contourner ce problème, nous conseillons d'écrire vos propres fonctions (il y a des exemples sur <http://php.net).>
Cela peut éventuellement être mis dans un fichier partagé qui sera ensuite inclus systématiquement dans votre code lorsque l'utilisation est nécessaire.