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
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
@ -134,15 +136,15 @@ Voici les directives de base :
~~~
[global]
pid = /run/php5-fpm.pid
pid = /run/php/php7.0-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` :
On définit ensuite un ou plusieurs *pools* FPM via `/etc/php/7.0/fpm/pool.d/*.conf` :
~~~
[www]
listen = /var/run/php5-fpm.sock
listen = /run/php/php7.0-fpm.sock
;listen = 127.0.0.1:9000
user = www-data
group = www-data
@ -193,7 +195,7 @@ access.log = log/$pool.access.log
#### 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 {
@ -205,7 +207,7 @@ server {
location ~ \.php$ {
try_files $uri =404;
#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;
include fastcgi_params;
}
@ -223,12 +225,12 @@ Enabling module proxy.
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}
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/"
ProxyPassMatch "^/(.*\.php(/.*)?)$" "unix:/var/run/php/php7.0-fpm.sock|fcgi://localhost/home/foo/www/"
~~~
### 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>
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).
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.
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…
* 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_ :
~~~
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 :
~~~
@ -286,7 +294,7 @@ Voir le blog d'un développeur de Memcached à ce sujet : <http://dormando.livej
~~~
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
@ -358,46 +366,6 @@ PHP Warning: putenv() has been disabled for security reasons
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
@ -407,13 +375,19 @@ Puis activer la configuration :
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 :
@ -425,7 +399,7 @@ $ cd cphalcon/build
Configurer PHP et Apache :
Ajouter un fichier `/etc/php5/mods-available/phalcon.ini` :
Ajouter un fichier `phalcon.ini` :
~~~
extension=phalcon.so
@ -434,25 +408,28 @@ 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
# ln -s mods-available/phalcon.ini cli/conf.d/30-phalcon.ini
# ln -s mods-available/phalcon.ini 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
$ git clone https://github.com/phalcon/phalcon-devtools.git
# cp phalcon-devtools/phalcon.php /usr/local/bin/phalcon
# chmod 755 /usr/local/bin/phalcon
~~~
## Debug
### strace
Au niveau système, pour voir exactement ce qui est fait. (Ouverture de fichiers, connexion distante, requêtes MySQL).
Exemple d'utilisations.
Au niveau système, on peut utilise `strace` pour voir exactement ce qui est
fait (ouvertures de fichiers, connexions distantes, requêtes MySQL).
Exemple d'utilisations :
~~~
# Affiche les fichiers ouverts.
@ -469,7 +446,8 @@ $ strace -ttt 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
@ -489,10 +467,16 @@ $ grep SELECT strace.*
[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
@ -508,27 +492,22 @@ Pour activer dans un vhost Apache :
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.
La seconde colonne contient l'empreinte mémoire, idéal aussi pour répérer une fonction qui utilise trop de mémoire.
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.
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.
Voici un exemple :
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.
[[Image(call1.png)]]
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.
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
@ -537,15 +516,20 @@ Puis dans le fichier de configuration config.php on mettre profilerDir à /home/
Installation :
~~~
# aptitude install gdb php5-dbg
# echo 1 > /proc/sys/kernel/core_uses_pid
# echo 'deb http://deb.debian.org/debian-debug/ stretch-debug main' > /etc/apt/sources.list.d/debug.list
# 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 :
~~~
# echo 1 > /proc/sys/kernel/core_uses_pid
# mkdir /home/coredump
# chmod 1777 /home/coredump
# echo '/home/coredump/core-%e-%p' > /proc/sys/kernel/core_pattern
@ -561,7 +545,7 @@ Pour désactiver :
# 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
@ -570,9 +554,7 @@ $ gdb /usr/sbin/php-fpm core-php5-fpm.7409
(gdb) bt -100
~~~
## Quelques messages typiques
Erreurs de mémoire (souvent des boucles) :
Message typique, des erreurs de mémoire (souvent des boucles) :
~~~
#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
Doc officielle :
<https://github.com/facebook/hhvm/wiki/Prebuilt-Packages-on-Debian-8>
<https://github.com/facebook/hhvm/wiki/FastCGI>
~~~
# 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
# apt update && apt install hhvm
# echo deb http://dl.hhvm.com/debian jessie main > /etc/apt/sources.list.d/hhvm.list
# apt update
# install hhvm
~~~
Configuration via le fichier `/etc/hhvm/server.ini`
On pourra passer en mode socket plutôt que sur un port TCP.
Configuration via le fichier `/etc/hhvm/server.ini`, on pourra passer en mode socket plutôt que sur un port TCP :
~~~
;hhvm.server.port = 9000
@ -619,7 +599,7 @@ Mise en place avec Nginx :
# /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)$ {
@ -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.
~~~