relecture

This commit is contained in:
John Doe 2017-09-10 16:38:04 +02:00
parent 31740bb6ca
commit 9d8c1e2bce

View file

@ -18,6 +18,8 @@ Voici les versions de PHP actuellement supportées sous Debian :
## Installation ## Installation
Nous installons toujours PHP CLI, certaines dépendances classiques ainsi que les outils [Composer](https://getcomposer.org/) et [PHPMailer](https://github.com/PHPMailer/PHPMailer) :
~~~ ~~~
# 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 # 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
@ -134,15 +136,15 @@ Voici les directives de base :
~~~ ~~~
[global] [global]
pid = /run/php5-fpm.pid pid = /run/php/php7.0-fpm.pid
error_log = /var/log/php5-fpm.log error_log = /var/log/php5-fpm.log
~~~ ~~~
On définit ensuite un ou plusieurs *pools* FPM via `/etc/php5/fpm/pool.d/*.conf` : On définit ensuite un ou plusieurs *pools* FPM via `/etc/php/7.0/fpm/pool.d/*.conf` :
~~~ ~~~
[www] [www]
listen = /var/run/php5-fpm.sock listen = /run/php/php7.0-fpm.sock
;listen = 127.0.0.1:9000 ;listen = 127.0.0.1:9000
user = www-data user = www-data
group = www-data group = www-data
@ -193,7 +195,7 @@ access.log = log/$pool.access.log
#### Configuration FPM avec Nginx #### Configuration FPM avec Nginx
On configure PHP-FPM avec Nginx, par exemple dans un Virtualhost : On configure FPM avec Nginx, par exemple dans un Virtualhost :
~~~ ~~~
server { server {
@ -205,7 +207,7 @@ server {
location ~ \.php$ { location ~ \.php$ {
try_files $uri =404; try_files $uri =404;
#fastcgi_pass 127.0.0.1:9000; #fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_param SCRIPT_FILENAME /home/foo/www$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME /home/foo/www$fastcgi_script_name;
include fastcgi_params; include fastcgi_params;
} }
@ -223,12 +225,12 @@ Enabling module proxy.
Enabling module proxy_fcgi. Enabling module proxy_fcgi.
~~~ ~~~
On configure PHP-FPM avec Apache, par exemple dans un VirtualHost : On configure FPM avec Apache, par exemple dans un VirtualHost :
~~~{.apache} ~~~{.apache}
DocumentRoot /home/bench/www/ DocumentRoot /home/bench/www/
#ProxyPassMatch "^/(.*\.php(/.*)?)$" "fcgi://127.0.0.1:9000//home/foo/www/$1" #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/" ProxyPassMatch "^/(.*\.php(/.*)?)$" "unix:/var/run/php/php7.0-fpm.sock|fcgi://localhost/home/foo/www/"
~~~ ~~~
### Configuration mod_php ### Configuration mod_php
@ -258,20 +260,26 @@ Par exemple, au sein d'un VirtualHost on peut mettre les paramètres suivants :
<http://php.net/manual/en/book.session.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. Lorsque des sessions PHP sont utilisées (fonctions session_XXX() 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). 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 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 une méthode plus performante si vous avez un serveur dédié. Évidemment il fortement déconseillé 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*.
* La méthode la plus simple si votre site web est en mono-serveur ou en mode sticky est de monter le répertoire qui stocker les fichiers en *TMPFS*.
Cela se fait par exemple en ajoutant la ligne suivante dans votre _fstab_ : 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 tmpfs /var/lib/php/sessions tmpfs defaults,noexec,nosuid,nodev,size=256m 0 0
~~~ ~~~
> *Note* : Pour Debian 8 :
>
> ~~~
> 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 : * Les sessions peuvent être stockées dans un ou plusieurs serveurs *Memcached* avec les paramètres suivants :
~~~ ~~~
@ -286,7 +294,7 @@ Voir le blog d'un développeur de Memcached à ce sujet : <http://dormando.livej
~~~ ~~~
session.save_handler = redis session.save_handler = redis
session.save_path = "tcp://192.0.43.10:6379?auth=<password>,tcp://192.0.43.11:6379?auth=<password>" 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 * Les sessions peuvent être stockées dans [Sharedance](http://www.pureftpd.org/project/sharedance), un petit logiciel spécialement conçu pour
@ -358,46 +366,6 @@ PHP Warning: putenv() has been disabled for security reasons
Composer version 1.5.1 2017-08-09 16:07:22 Composer version 1.5.1 2017-08-09 16:07:22
~~~ ~~~
## 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
~~~
## Module du framework phalcon ## Module du framework phalcon
@ -407,13 +375,19 @@ Puis activer la configuration :
Installer les dépendances suivantes : Installer les dépendances suivantes :
~~~ ~~~
# apt install php5-dev libpcre3-dev gcc make php5-mysql # apt install php7.0-dev libpcre3-dev gcc make php7.0-mysql
~~~ ~~~
Cloner la dernière version stable (2.0.x à ce jour) : > *Note* : Pour Debian 8 :
>
> ~~~
> # apt install php5-dev libpcre3-dev gcc make php5-mysql
> ~~~
Cloner la dernière version stable :
~~~ ~~~
$ git clone --depth=1 git://github.com/phalcon/cphalcon.git -b 2.0.x $ git clone --depth=1 git://github.com/phalcon/cphalcon.git
~~~ ~~~
Compiler et installer le module : Compiler et installer le module :
@ -425,7 +399,7 @@ $ cd cphalcon/build
Configurer PHP et Apache : Configurer PHP et Apache :
Ajouter un fichier `/etc/php5/mods-available/phalcon.ini` : Ajouter un fichier `phalcon.ini` :
~~~ ~~~
extension=phalcon.so extension=phalcon.so
@ -434,25 +408,28 @@ extension=phalcon.so
Puis activer la configuration : Puis activer la configuration :
~~~ ~~~
# ln -s /etc/php5/mods-available/phalcon.ini /etc/php5/cli/conf.d/30-phalcon.ini # ln -s mods-available/phalcon.ini cli/conf.d/30-phalcon.ini
# ln -s /etc/php5/mods-available/phalcon.ini /etc/php5/apache2/conf.d/30-phalcon.ini # ln -s mods-available/phalcon.ini apache2/conf.d/30-phalcon.ini
# systemctl reload apache2 # systemctl reload apache2
~~~ ~~~
Pour installer les phalcon devtools : Pour installer les phalcon devtools :
~~~ ~~~
$ git clone https://github.com/phalcon/phalcon-devtools.git -b 2.0.x /opt/phalcon-devtools $ git clone https://github.com/phalcon/phalcon-devtools.git
# ln -s /opt/phalcon-devtools/phalcon.php /usr/local/bin/phalcon # cp phalcon-devtools/phalcon.php /usr/local/bin/phalcon
# chmod ugo+x /usr/local/bin/phalcon # chmod 755 /usr/local/bin/phalcon
~~~ ~~~
## Debug ## Debug
### strace ### strace
Au niveau système, pour voir exactement ce qui est fait. (Ouverture de fichiers, connexion distante, requêtes MySQL). Au niveau système, on peut utilise `strace` pour voir exactement ce qui est
Exemple d'utilisations. fait (ouvertures de fichiers, connexions distantes, requêtes MySQL).
Exemple d'utilisations :
~~~ ~~~
# Affiche les fichiers ouverts. # Affiche les fichiers ouverts.
@ -469,7 +446,8 @@ $ strace -ttt php index.php
$ strace -s 65535 -ff php index.php $ strace -s 65535 -ff php index.php
~~~ ~~~
Dans certains cas, des CMS gèrent mal le fait qu'on exécute le code via PHP-CLI. On pourra utiliser PHP-CGI pour le tromper, c'est notamment le cas de Magento. Dans certains cas, des CMS gèrent mal le fait qu'on exécute le code via PHP-CLI.
On pourra utiliser PHP-CGI pour le tromper, c'est notamment le cas de Magento.
~~~ ~~~
$ HTTP_HOST="www.monsite.com" strace php-cgi index.php $ HTTP_HOST="www.monsite.com" strace php-cgi index.php
@ -489,10 +467,16 @@ $ grep SELECT strace.*
[Xdebug](https://xdebug.org/) est un débogueur PHP. [Xdebug](https://xdebug.org/) est un débogueur PHP.
~~~ ~~~
# aptitude install php5-xdebug # aptitude install php-xdebug
~~~ ~~~
Pour l'activer, dans _/etc/php5/conf.d/xdebug.ini_ : > *Note* : Pour Debian 8 :
>
> ~~~
> # aptitude install php5-xdebug
> ~~~
On aura ainsi un fichier `xdebug.ini` que l'on pourra compléter ainsi :
~~~ ~~~
zend_extension=/usr/lib/php5/20090626/xdebug.so zend_extension=/usr/lib/php5/20090626/xdebug.so
@ -508,27 +492,22 @@ Pour activer dans un vhost Apache :
php_admin_value xdebug.profiler_enable 1 php_admin_value xdebug.profiler_enable 1
~~~ ~~~
Attention, bien mettre le bon chemin de l'extension zend (dépend de votre version PHP) et les droits sur le répertoire _/home/xdebug_. Notez qu'il peut se remplir très vite une fois activé ! Attention, bien mettre les bons droits sur le répertoire _/home/xdebug_. Notez qu'il peut se remplir très vite une fois activé !
On obtient des fichiers _trace.XXX.xt_ et _cachegrind.out.XXXX_ On obtient des fichiers `trace.XXX.xt` et `cachegrind.out.XXXX`
Le fichier xt est une trace de tout les appels aux fonctions PHP du code préfixé par le temps d'exécution. Idéal pour trouver une fonction anormalement longue. Les fichiers `trace.XXX.xt` sont des traces de tous les appels aux fonctions PHP du code préfixé par le temps d'exécution. Idéal pour trouver une fonction anormalement longue. La seconde colonne contient l'empreinte mémoire, idéal aussi pour répérer une fonction qui utilise trop de mémoire.
La seconde colonne contient l'empreinte mémoire, idéal aussi pour répérer une fonction qui utilise trop de mémoire.
Le fichier _cachegrind_ peuvent être lus avec l'outil kcachegrind (pour Linux) ou wincachegrind (sous Windows), cela permet de schématiser les appels aux fonctions PHP et de voir le temps passé en % et le nombre d'appels. Les fichiers `cachegrind.out.XXXX` peuvent être lus avec l'outil _kcachegrind_ (pour Linux) ou _wincachegrind_ (sous Windows), cela permet de schématiser les appels aux fonctions PHP et de voir le temps passé en % et le nombre d'appels.
Voici un exemple :
[[Image(call1.png)]] Webgrind en PHP permet de faire comme kcachegrind mais via un navigateur :
Ici, 30% du temps est passé dans php::uasort, appelé par Mage_Core_Model_Layout->getOutput.
Webgrind en PHP permet de faire comme kcachegrind mais via un navigateur.
~~~ ~~~
$ git clone <https://github.com/jokkedk/webgrind.git> $ git clone https://github.com/jokkedk/webgrind.git
~~~ ~~~
Puis dans le fichier de configuration config.php on mettre profilerDir à /home/xdebug. Il faut aussi installer le package graphviz et mettre dotExecutable à /usr/bin/dot si on veut profiter du graphique « call graph ». Il faut mettre _profilerDir_ à _/home/xdebug_ dans `config.php`
Pour profiter du graphique « call graph » il faut installer le package _graphviz_ et mettre dotExecutable à /usr/bin/dot.
### coredump ### coredump
@ -537,15 +516,20 @@ Puis dans le fichier de configuration config.php on mettre profilerDir à /home/
Installation : Installation :
~~~ ~~~
# aptitude install gdb php5-dbg # echo 'deb http://deb.debian.org/debian-debug/ stretch-debug main' > /etc/apt/sources.list.d/debug.list
# echo 1 > /proc/sys/kernel/core_uses_pid # apt update
# apt install php7.0-common-dbgsym php7.0-cli-dbgsym
~~~ ~~~
Note : En Squeeze il est nécessaire d'utiliser le gdb de squeeze-backports. > *Note* : Pour Debian 8 :
>
> # aptitude install gdb php5-dbg
> ~~~
Pour activer : Pour activer :
~~~ ~~~
# echo 1 > /proc/sys/kernel/core_uses_pid
# mkdir /home/coredump # mkdir /home/coredump
# chmod 1777 /home/coredump # chmod 1777 /home/coredump
# echo '/home/coredump/core-%e-%p' > /proc/sys/kernel/core_pattern # echo '/home/coredump/core-%e-%p' > /proc/sys/kernel/core_pattern
@ -561,7 +545,7 @@ Pour désactiver :
# echo '' > /proc/sys/kernel/core_pattern # echo '' > /proc/sys/kernel/core_pattern
~~~ ~~~
Pour lire les traces de PHP-FPM : Pour lire les traces de FPM :
~~~ ~~~
$ gdb /usr/sbin/php-fpm core-php5-fpm.7409 $ gdb /usr/sbin/php-fpm core-php5-fpm.7409
@ -570,9 +554,7 @@ $ gdb /usr/sbin/php-fpm core-php5-fpm.7409
(gdb) bt -100 (gdb) bt -100
~~~ ~~~
## Quelques messages typiques Message typique, des erreurs de mémoire (souvent des boucles) :
Erreurs de mémoire (souvent des boucles) :
~~~ ~~~
#0 xbuf_format_converter (xbuf=0x77a812cee810, fmt=0xa6d5a1 "%ld", ap=Cannot access memory at address 0x77a812cedf10) #0 xbuf_format_converter (xbuf=0x77a812cee810, fmt=0xa6d5a1 "%ld", ap=Cannot access memory at address 0x77a812cedf10)
@ -593,19 +575,17 @@ Fatal error: Maximum function nesting level of '100' reached, aborting! in [...]
## HHVM ## HHVM
Doc officielle :
<https://github.com/facebook/hhvm/wiki/Prebuilt-Packages-on-Debian-8> <https://github.com/facebook/hhvm/wiki/Prebuilt-Packages-on-Debian-8>
<https://github.com/facebook/hhvm/wiki/FastCGI> <https://github.com/facebook/hhvm/wiki/FastCGI>
~~~ ~~~
# apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449 # apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449
# echo deb <http://dl.hhvm.com/debian> jessie main > /etc/apt/sources.list.d/hhvm.list # echo deb http://dl.hhvm.com/debian jessie main > /etc/apt/sources.list.d/hhvm.list
# apt update && apt install hhvm # apt update
# install hhvm
~~~ ~~~
Configuration via le fichier `/etc/hhvm/server.ini` Configuration via le fichier `/etc/hhvm/server.ini`, on pourra passer en mode socket plutôt que sur un port TCP :
On pourra passer en mode socket plutôt que sur un port TCP.
~~~ ~~~
;hhvm.server.port = 9000 ;hhvm.server.port = 9000
@ -619,7 +599,7 @@ Mise en place avec Nginx :
# /etc/init.d/nginx restart # /etc/init.d/nginx restart
~~~ ~~~
Cela crée le fichier /etc/nginx/hhvm.conf. Cela crée le fichier `/etc/nginx/hhvm.conf` :
~~~ ~~~
location ~ \.(hh|php)$ { location ~ \.(hh|php)$ {
@ -632,7 +612,7 @@ location ~ \.(hh|php)$ {
} }
~~~ ~~~
HHVM écoute par défaut sur le port 9000. (Attention si vous avez une configraution FPM qui écoute aussi sur ce port là). HHVM écoute par défaut sur le port 9000 (attention si vous avez une configraution FPM qui écoute aussi sur ce port là).
Il faudra inclure ce fichier de configuration dans votre vhost qui a besoin de HHVM. Il faudra inclure ce fichier de configuration dans votre vhost qui a besoin de HHVM.
~~~ ~~~