Merge des différentes docs... reste à relire/vérifier tout ça

This commit is contained in:
Gregory Colpart 2017-09-08 19:42:47 +02:00
parent 955c0efba3
commit 4817a0f0cb

View file

@ -447,6 +447,198 @@ $ git clone https://github.com/phalcon/phalcon-devtools.git -b 2.0.x /opt/phalco
# chmod ugo+x /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.
~~~
# Affiche les fichiers ouverts.
$ strace -ff -e trace=open php index.php
# Affiche les appels réseaux.
$ strace -ff -e trace=network php index.php
# Compte les appels systèmes et le temps passé.
$ strace -c php index.php
# Calcul du temps d'exécution d'un appel.
$ strace -T php index.php
# Affichage d'un timestamp devant chaque appel.
$ strace -ttt php index.php
# Strace verbeux.
$ 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.
~~~
$ HTTP_HOST="www.monsite.com" strace php-cgi index.php
~~~
Par exemple, peut récupérer les requêtes MySQL ainsi.
~~~
$ strace -s65535 -e trace=write -ff -o strace php-cgi index.php
$ grep SELECT strace.*
~~~
### xdebug
<https://xdebug.org/docs/>
[Xdebug](https://xdebug.org/) est un débogueur PHP.
~~~
# aptitude install php5-xdebug
~~~
Pour l'activer, dans _/etc/php5/conf.d/xdebug.ini_ :
~~~
zend_extension=/usr/lib/php5/20090626/xdebug.so
;xdebug.auto_trace=On
;xdebug.profiler_enable=1
xdebug.profiler_output_dir=/home/xdebug
xdebug.trace_output_dir=/home/xdebug
~~~
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é !
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.
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 :
[[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.
~~~
$ 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 ».
### coredump
<https://bugs.php.net/bugs-generating-backtrace.php>
Installation :
~~~
# aptitude install gdb php5-dbg
# echo 1 > /proc/sys/kernel/core_uses_pid
~~~
Note : En Squeeze il est nécessaire d'utiliser le gdb de squeeze-backports.
Pour activer :
~~~
# mkdir /home/coredump
# chmod 1777 /home/coredump
# echo '/home/coredump/core-%e-%p' > /proc/sys/kernel/core_pattern
# echo "* soft core unlimited" >> /etc/security/limits.conf
# ulimit -c unlimited
# echo "ulimit -c unlimited" >> /etc/default/apache2
# /etc/init.d/apache2 restart
~~~
Pour désactiver :
~~~
# echo '' > /proc/sys/kernel/core_pattern
~~~
Pour lire les traces de PHP-FPM :
~~~
$ gdb /usr/sbin/php-fpm core-php5-fpm.7409
(gdb) bt
(gdb) bt -100
~~~
## Quelques messages typiques
Erreurs de mémoire (souvent des boucles) :
~~~
#0 xbuf_format_converter (xbuf=0x77a812cee810, fmt=0xa6d5a1 "%ld", ap=Cannot access memory at address 0x77a812cedf10)
#0 0x00007ffd348abe53 in _zend_mm_free_canary_int (heap=0x7ffd39b11130, p=0x21143c453bb97f0f) at /build/buildd/php5-5.3.2/Zend/zend_alloc_canary.c:2090
2090 /build/buildd/php5-5.3.2/Zend/zend_alloc_canary.c: No such file or directory.
in /build/buildd/php5-5.3.2/Zend/zend_alloc_canary.c
#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 :
~~~
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
~~~
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.file_socket=/var/run/hhvm/sock
~~~
Mise en place avec Nginx :
~~~
# /usr/share/hhvm/install_fastcgi.sh
# /etc/init.d/nginx restart
~~~
Cela crée le fichier /etc/nginx/hhvm.conf.
~~~
location ~ \.(hh|php)$ {
fastcgi_keep_conn on;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/var/run/hhvm/sock
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
~~~
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.
~~~
include /etc/nginx/hhvm.conf;
~~~
## FAQ