diff --git a/HowtoPHP.md b/HowtoPHP.md index 992cd24d..307c87e1 100644 --- a/HowtoPHP.md +++ b/HowtoPHP.md @@ -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 + + + +[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 +~~~ + +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 + + + +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 : + + + +~~~ +# apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449 +# echo deb 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