Reformatage du texte de HowtoPHP.md avec fmt(1)
Plus facile a lire dans un éditeur.
This commit is contained in:
parent
e99e0aac21
commit
93ca1b9400
218
HowtoPHP.md
218
HowtoPHP.md
|
@ -6,11 +6,15 @@ title: Howto PHP
|
||||||
* Documentation : <http://php.net/manual/en/>
|
* Documentation : <http://php.net/manual/en/>
|
||||||
* Rôle Ansible : <https://forge.evolix.org/projects/ansible-roles/repository/show/php>
|
* 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](http://php.net/) est un langage de programmation populaire
|
||||||
PHP peut s'utiliser en CLI (ligne de commande), via mod_php (module intégré à [Apache](HowtoApache)) ou via FPM (FastCGI Process Manager).
|
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).
|
||||||
|
|
||||||
Il existe [plusieurs versions de PHP](http://php.net/supported-versions.php).
|
|
||||||
Voici les versions de PHP actuellement supportées sous Debian :
|
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 7 : PHP 5.4.45
|
||||||
* Debian 8 : PHP 5.6.19
|
* Debian 8 : PHP 5.6.19
|
||||||
|
@ -18,7 +22,10 @@ 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) :
|
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
|
||||||
|
@ -41,9 +48,15 @@ Composer version 1.2.2 2016-11-03 17:43:15
|
||||||
|
|
||||||
### PHP 7.1 et/ou 7.2 avec deb.sury.org
|
### PHP 7.1 et/ou 7.2 avec deb.sury.org
|
||||||
|
|
||||||
Si l'on a absolument besoin d'une version de PHP plus récente (ie: 7.1 ou 7.2), il est possible de l'installer pour Debian 9 avec le dépôt [deb.sury.org](https://deb.sury.org/) d'Ondřej Surý (mainteneur officiel des paquets PHP) :
|
Si l'on a absolument besoin d'une version de PHP plus récente (ie:
|
||||||
|
7.1 ou 7.2), il est possible de l'installer pour Debian 9 avec le
|
||||||
|
dépôt [deb.sury.org](https://deb.sury.org/) d'Ondřej Surý (mainteneur
|
||||||
|
officiel des paquets PHP) :
|
||||||
|
|
||||||
Il est d'ailleurs préférable d'utiliser les paquets PHP qui précisent la version de php (php7.0, php7.1 ou php7.2 - Exemple php7.1-mbstring ou libapache2-mod-php7.1). Les paquets génériques php-XXX dépendent toujours de la dernière version de PHP disponible.
|
Il est d'ailleurs préférable d'utiliser les paquets PHP qui précisent
|
||||||
|
la version de php (php7.0, php7.1 ou php7.2 - Exemple php7.1-mbstring
|
||||||
|
ou libapache2-mod-php7.1). Les paquets génériques php-XXX dépendent
|
||||||
|
toujours de la dernière version de PHP disponible.
|
||||||
|
|
||||||
Exemple, si on souhaite seulement php7.1 :
|
Exemple, si on souhaite seulement php7.1 :
|
||||||
|
|
||||||
|
@ -60,11 +73,17 @@ Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
|
||||||
with Zend OPcache v7.1.9-1+0~20170902060745.8+stretch~1.gbpebe5d6, Copyright (c) 1999-2017, by Zend Technologies
|
with Zend OPcache v7.1.9-1+0~20170902060745.8+stretch~1.gbpebe5d6, Copyright (c) 1999-2017, by Zend Technologies
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
Si on installe php7.2 cela casse phpmyadmin, les Bug report ont été ouvert chez phpmyadmin ici :
|
Si on installe php7.2 cela casse phpmyadmin, les Bug report ont été
|
||||||
[https://github.com/phpmyadmin/phpmyadmin/issues/13932](https://github.com/phpmyadmin/phpmyadmin/issues/13932) et aussi chez Debian : [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=890595](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=890595)
|
ouvert chez phpmyadmin ici :
|
||||||
|
[https://github.com/phpmyadmin/phpmyadmin/issues/13932](https://github.com/phpmyadmin/phpmyadmin/issues/13932)
|
||||||
|
et aussi chez Debian :
|
||||||
|
[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=890595](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=890595)
|
||||||
|
|
||||||
|
|
||||||
|
Le patch est a appliquer dans le fichier
|
||||||
|
_/usr/share/phpmyadmin/libraries/sql.lib.php_ il faut modifier la
|
||||||
|
ligne 613 :
|
||||||
|
|
||||||
Le patch est a appliquer dans le fichier _/usr/share/phpmyadmin/libraries/sql.lib.php_ il faut modifier la ligne
|
|
||||||
613 :
|
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
|| (count($analyzed_sql_results['select_expr'] == 1)
|
|| (count($analyzed_sql_results['select_expr'] == 1)
|
||||||
|
@ -78,7 +97,8 @@ par ceci :
|
||||||
|
|
||||||
### PHP-FPM
|
### PHP-FPM
|
||||||
|
|
||||||
PHP-FPM (FastCGI Process Manager) est une façon alternative d'utiliser PHP avec [Apache](HowtoApache) ou [Nginx](HowtoNginx).
|
PHP-FPM (FastCGI Process Manager) est une façon alternative d'utiliser
|
||||||
|
PHP avec [Apache](HowtoApache) ou [Nginx](HowtoNginx).
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
# apt install php-fpm
|
# apt install php-fpm
|
||||||
|
@ -148,10 +168,12 @@ Fichiers de configuration :
|
||||||
|
|
||||||
### Configuration de base (php.ini)
|
### Configuration de base (php.ini)
|
||||||
|
|
||||||
Il existe un fichier `php.ini` distinct suivant l’utilisation de PHP : cli, mod_php et FPM.
|
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.
|
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 :
|
Le fichier `/etc/php/7.0/fpm/conf.d/z-evolinux-defaults.ini` contient
|
||||||
|
nos optimisations basiques :
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
short_open_tag = Off
|
short_open_tag = Off
|
||||||
|
@ -176,7 +198,8 @@ 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/php/7.0/fpm/pool.d/*.conf` :
|
On définit ensuite un ou plusieurs *pools* FPM via
|
||||||
|
`/etc/php/7.0/fpm/pool.d/*.conf` :
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
[www]
|
[www]
|
||||||
|
@ -193,10 +216,14 @@ php_admin_flag[log_errors] = on
|
||||||
php_admin_value[memory_limit] = 32M
|
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.
|
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)).
|
||||||
|
|
||||||
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 = dynamic
|
||||||
|
@ -207,8 +234,11 @@ pm.max_spare_servers = 30
|
||||||
pm.max_requests = 100
|
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.
|
Avec de nombreux pools, on optera pour le mode **ondemand** qui ne
|
||||||
D'après nos tests, les performances restent − étonnamment − tout à fait acceptables.
|
prépare pas de process mais les crée à chaque demande. D'après nos
|
||||||
|
tests, les performances restent − étonnamment − tout à fait
|
||||||
|
acceptables.
|
||||||
|
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
pm = ondemand
|
pm = ondemand
|
||||||
|
@ -271,9 +301,12 @@ ProxyPassMatch "^/(.*\.php(/.*)?)$" "unix:/var/run/php/php7.0-fpm.sock|fcgi://lo
|
||||||
|
|
||||||
### Configuration mod_php
|
### Configuration mod_php
|
||||||
|
|
||||||
Avec mod_php on peut forcer la plupart des options du php.ini dans la configuration Apache.
|
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 :
|
|
||||||
|
Par exemple, au sein d'un VirtualHost on peut mettre les paramètres
|
||||||
|
suivants :
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
<VirtualHost *:80>
|
<VirtualHost *:80>
|
||||||
|
@ -296,15 +329,22 @@ 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_XXX() dans le code), des informations sont stockées côté serveur.
|
Lorsque des sessions PHP sont utilisées (fonctions session_XXX()
|
||||||
Le navigateur conserve uniquement l'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).
|
dans le code), des informations sont stockées côté serveur. Le
|
||||||
|
navigateur conserve uniquement l'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
|
||||||
une méthode plus performante si vous avez un serveur dédié. Évidemment il est fortement déconseillé de stocker les sessions dans une base de données SQL…
|
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 fortement déconseillé de stocker les sessions dans une base
|
||||||
|
de données SQL…
|
||||||
|
|
||||||
|
|
||||||
* 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_ :
|
* 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/php/sessions tmpfs defaults,noexec,nosuid,nodev,size=256m 0 0
|
tmpfs /var/lib/php/sessions tmpfs defaults,noexec,nosuid,nodev,size=256m 0 0
|
||||||
|
@ -323,8 +363,10 @@ session.save_handler = memcached
|
||||||
session.save_path = "192.0.2.10:11211,192.0.2.11:11211"
|
session.save_path = "192.0.2.10:11211,192.0.2.11:11211"
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
Par contre, contrairement aux idées reçues, ce n'est pas conseillé. Memcached est fait pour « cacher » et non « stocker ».
|
Par contre, contrairement aux idées reçues, ce n'est pas conseillé.
|
||||||
Voir le blog d'un développeur de Memcached à ce sujet : <http://dormando.livejournal.com/495593.html>
|
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 :
|
* Les sessions peuvent être stockées dans un ou plusieurs serveurs *Redis* avec les paramètres suivants :
|
||||||
|
|
||||||
|
@ -333,8 +375,7 @@ session.save_handler = redis
|
||||||
session.save_path = "tcp://192.0.2.10:6379?auth=PASSWORD,tcp://192.0.2.11:6379?auth=PASSWORD"
|
session.save_path = "tcp://192.0.2.10:6379?auth=PASSWORD,tcp://192.0.2.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 stocker les sessions PHP. Il n'est plus maintenu, mais très simple, il est toujours fonctionnel. Voici un exemple d'utilisation :
|
||||||
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
|
auto_prepend_file = /usr/local/etc/sharedance.php
|
||||||
|
@ -355,10 +396,14 @@ session.save_path="tcp://192.0.2.10:1978,tcp://192.0.2.10:1978"
|
||||||
|
|
||||||
* Documentation : <https://getcomposer.org/doc/>
|
* 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](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_.
|
Composer s'utilise sans les droits _root_. Il s'appuie sur la
|
||||||
Il s'appuie sur la présence d'un fichier `composer.json` qui déclare les bibliothèques à installer.
|
présence d'un fichier `composer.json` qui déclare les bibliothèques
|
||||||
|
à installer.
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
$ composer about
|
$ composer about
|
||||||
|
@ -462,8 +507,9 @@ $ git clone https://github.com/phalcon/phalcon-devtools.git
|
||||||
|
|
||||||
### strace
|
### strace
|
||||||
|
|
||||||
Au niveau système, on peut utilise `strace` pour voir exactement ce qui est
|
Au niveau système, on peut utilise `strace` pour voir exactement
|
||||||
fait (ouvertures de fichiers, connexions distantes, requêtes MySQL).
|
ce qui est fait (ouvertures de fichiers, connexions distantes,
|
||||||
|
requêtes MySQL).
|
||||||
|
|
||||||
Exemple d'utilisations :
|
Exemple d'utilisations :
|
||||||
|
|
||||||
|
@ -482,8 +528,9 @@ $ 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.
|
Dans certains cas, des CMS gèrent mal le fait qu'on exécute le code
|
||||||
On pourra utiliser PHP-CGI pour le tromper, c'est notamment le cas de Magento.
|
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
|
||||||
|
@ -512,7 +559,8 @@ $ grep SELECT strace.*
|
||||||
> # aptitude install php5-xdebug
|
> # aptitude install php5-xdebug
|
||||||
> ~~~
|
> ~~~
|
||||||
|
|
||||||
On aura ainsi un fichier `xdebug.ini` que l'on pourra compléter ainsi :
|
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
|
||||||
|
@ -528,25 +576,36 @@ Pour activer dans un vhost Apache :
|
||||||
php_admin_value xdebug.profiler_enable 1
|
php_admin_value xdebug.profiler_enable 1
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
Attention, bien mettre les bons 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`
|
||||||
|
|
||||||
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 repé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 repérer une fonction qui
|
||||||
|
utilise trop de mémoire.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
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 :
|
Voici un exemple :
|
||||||
|
|
||||||
![Ici, 30% du temps est passé dans php::uasort, appelé par Mage_Core_Model_Layout->getOutput.](/call141f0.png)
|
![Ici, 30% du temps est passé dans php::uasort, appelé par Mage_Core_Model_Layout->getOutput.](/call141f0.png)
|
||||||
|
|
||||||
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
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
Il faut mettre _profilerDir_ à _/home/xdebug_ dans `config.php`
|
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.
|
Pour profiter du graphique « call graph » il faut installer le
|
||||||
|
package _graphviz_ et mettre dotExecutable à /usr/bin/dot.
|
||||||
|
|
||||||
### coredump
|
### coredump
|
||||||
|
|
||||||
|
@ -606,7 +665,9 @@ Message typique, des erreurs de mémoire (souvent des boucles) :
|
||||||
#0 0x00000000007e10b1 in zend_mm_free_cache ()
|
#0 0x00000000007e10b1 in zend_mm_free_cache ()
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
Astuce : utiliser xdebug pour en savoir plus sur la boucle (xdebug étant limité à 100 récursions, il affichera les infos via une PHP Fatal Error :
|
Astuce : utiliser xdebug pour en savoir plus sur la boucle (xdebug
|
||||||
|
étant limité à 100 récursions, il affichera les infos via une PHP
|
||||||
|
Fatal Error :
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
Fatal error: Maximum function nesting level of '100' reached, aborting! in [...]
|
Fatal error: Maximum function nesting level of '100' reached, aborting! in [...]
|
||||||
|
@ -617,8 +678,11 @@ Fatal error: Maximum function nesting level of '100' reached, aborting! in [...]
|
||||||
|
|
||||||
### mod_php VS Apache/FPM VS Nginx/FPM
|
### mod_php VS Apache/FPM VS Nginx/FPM
|
||||||
|
|
||||||
Fin 2016, voici nos résultats d'un test sur un serveur physique « standard » avec une [application Symfony de test](https://github.com/acseo/symfony-perf).
|
Fin 2016, voici nos résultats d'un test sur un serveur physique «
|
||||||
Nous avons utilisé `ab -n 1000 -c 100` (1000 requêtes dont 100 en parallèle) avec nos configurations système par défaut :
|
standard » avec une [application Symfony de
|
||||||
|
test](https://github.com/acseo/symfony-perf).
|
||||||
|
Nous avons utilisé `ab -n 1000 -c 100` (1000 requêtes dont 100 en
|
||||||
|
parallèle) avec nos configurations système par défaut :
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
* Apache prefork FPM :
|
* Apache prefork FPM :
|
||||||
|
@ -645,10 +709,16 @@ Symfony form ~164ms
|
||||||
# apt install php7.0-opcache
|
# apt install php7.0-opcache
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
Depuis PHP 5.6 (Debian 8), un cache d'OPcode (code "intermédiaire" généré par PHP) intégré à PHP permet d'accélérer la génération du résultat des scripts PHP. Il remplace les « accélérateurs » comme APC, eAccelerator, etc. utilissé dans les versions précédentes de PHP.
|
Depuis PHP 5.6 (Debian 8), un cache d'OPcode (code "intermédiaire"
|
||||||
|
généré par PHP) intégré à PHP permet d'accélérer la génération du
|
||||||
|
résultat des scripts PHP. Il remplace les « accélérateurs » comme
|
||||||
|
APC, eAccelerator, etc. utilissé dans les versions précédentes de
|
||||||
|
PHP.
|
||||||
|
|
||||||
C'est le module OpCache configurable via `/etc/php5/mods-available/opcache.ini`.
|
C'est le module OpCache configurable via
|
||||||
La valeur de cache par défaut est de **64M**, paramètre `opcache.memory_consumption`.
|
`/etc/php5/mods-available/opcache.ini`.
|
||||||
|
La valeur de cache par défaut est de **64M**, paramètre
|
||||||
|
`opcache.memory_consumption`.
|
||||||
|
|
||||||
Pour surveiller OpCache on peut utiliser :
|
Pour surveiller OpCache on peut utiliser :
|
||||||
|
|
||||||
|
@ -668,7 +738,8 @@ Pour surveiller OpCache on peut utiliser :
|
||||||
# install hhvm
|
# 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
|
;hhvm.server.port = 9000
|
||||||
|
@ -695,8 +766,10 @@ location ~ \.(hh|php)$ {
|
||||||
}
|
}
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
HHVM écoute par défaut sur le port 9000 (attention si vous avez une configuration FPM qui écoute aussi sur ce port-là).
|
HHVM écoute par défaut sur le port 9000 (attention si vous avez une
|
||||||
Il faudra inclure ce fichier de configuration dans votre vhost qui a besoin de HHVM.
|
configuration FPM qui écoute aussi sur ce port-là). Il faudra
|
||||||
|
inclure ce fichier de configuration dans votre vhost qui a besoin
|
||||||
|
de HHVM.
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
include /etc/nginx/hhvm.conf;
|
include /etc/nginx/hhvm.conf;
|
||||||
|
@ -707,22 +780,34 @@ include /etc/nginx/hhvm.conf;
|
||||||
|
|
||||||
* J'ai un message d'erreur du type : _/usr/lib/php5/20090626/xcache.so doesn't appear to be a valid Zend extension_
|
* 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.
|
Remplacer `zend_extension=` par `extension=` pour le chargement du
|
||||||
|
module PHP.
|
||||||
|
|
||||||
* Certaines fonctions GD n'existent pas : imagerotate(), imageantialias(), etc.
|
* 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
|
Pour des raisons de sécurité et de maintenabilité, la version de
|
||||||
pas disponibles. Pour contourner ce problème, nous conseillons d'écrire vos propres fonctions (il y a des exemples sur <https://secure.php.net/>).
|
PHP de Debian n'embarque par le GD modifié par PHP. Ces fonctions
|
||||||
Cela peut éventuellement être mis dans un fichier partagé qui sera ensuite inclus systématiquement dans votre code lorsque l'utilisation est nécessaire.
|
ne sont pas disponibles. Pour contourner ce problème, nous conseillons
|
||||||
|
d'écrire vos propres fonctions (il y a des exemples sur
|
||||||
|
<https://secure.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.
|
||||||
|
|
||||||
|
|
||||||
* Site avec accents en ISO-8859 cassés
|
* Site avec accents en ISO-8859 cassés
|
||||||
|
|
||||||
Si vous avez des fichiers PHP en ISO-8859, on peut forcer son utilisation via `default_charset ISO-8859-15`. À noter que pour les fichiers HTML ou TXT, on peut utiliser l'option Apache `AddDefaultCharset ISO-8859-15`.
|
Si vous avez des fichiers PHP en ISO-8859, on peut forcer son
|
||||||
|
utilisation via `default_charset ISO-8859-15`. À noter que pour les
|
||||||
|
fichiers HTML ou TXT, on peut utiliser l'option Apache `AddDefaultCharset
|
||||||
|
ISO-8859-15`.
|
||||||
|
|
||||||
* Mes fonctions mysql_connect, mysql_pconnect, etc. ne fonctionnent plus en PHP 7
|
* Mes fonctions mysql_connect, mysql_pconnect, etc. ne fonctionnent plus en PHP 7
|
||||||
|
|
||||||
Il est conseillé d'utiliser PDO_MySQL, mais une méthode rapide est d'utiliser l'extension mysqli : <http://php.net/manual/fr/book.mysqli.php>
|
Il est conseillé d'utiliser PDO_MySQL, mais une méthode rapide est
|
||||||
La plupart des fonctions sont identiques avec mysqli... il suffit de remplacer `mysql_` par `mysqli_` !
|
d'utiliser l'extension mysqli : <http://php.net/manual/fr/book.mysqli.php>
|
||||||
|
La plupart des fonctions sont identiques avec mysqli... il suffit
|
||||||
|
de remplacer `mysql_` par `mysqli_` !
|
||||||
|
|
||||||
Quelques exceptions :
|
Quelques exceptions :
|
||||||
|
|
||||||
* mysql_pconnect() doit être remplacé par mysqli_connect()
|
* mysql_pconnect() doit être remplacé par mysqli_connect()
|
||||||
|
@ -731,16 +816,21 @@ Quelques exceptions :
|
||||||
|
|
||||||
* Erreurs avec le module php5-mysql
|
* Erreurs avec le module php5-mysql
|
||||||
|
|
||||||
Si vous avez des erreurs avec le module php5-mysql de Debian 7 (PHP 5.4) du type _ ERROR 1148 : The used command is not allowed with this MySQL version_ une solution peut être d'utiliser le module alternatif php5-mysqlnd
|
Si vous avez des erreurs avec le module php5-mysql de Debian 7 (PHP
|
||||||
|
5.4) du type _ ERROR 1148 : The used command is not allowed with
|
||||||
|
this MySQL version_ une solution peut être d'utiliser le module
|
||||||
|
alternatif php5-mysqlnd
|
||||||
|
|
||||||
* Connaître les codes d'Error Reporting php :
|
* Connaître les codes d'Error Reporting php :
|
||||||
|
|
||||||
Pour calculer le nombre d'error reporting php dans la configuration php, dans un vhost ou un .htacccess ce lien les répertories :
|
Pour calculer le nombre d'error reporting php dans la configuration
|
||||||
|
php, dans un vhost ou un .htacccess ce lien les répertories :
|
||||||
<https://maximivanov.github.io/php-error-reporting-calculator/>
|
<https://maximivanov.github.io/php-error-reporting-calculator/>
|
||||||
|
|
||||||
* Désactiver l'envoi de mail (dans un VirtualHost par exemple)
|
* Désactiver l'envoi de mail (dans un VirtualHost par exemple)
|
||||||
|
|
||||||
Il faut configurer la variable *sendmail_path* à /bin/true comme ceci, par exemple dans un VirtualHost :
|
Il faut configurer la variable *sendmail_path* à /bin/true comme
|
||||||
|
ceci, par exemple dans un VirtualHost :
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
php_admin_value sendmail_path "/bin/true -t -i -f www-foo"
|
php_admin_value sendmail_path "/bin/true -t -i -f www-foo"
|
||||||
|
|
Loading…
Reference in a new issue