Merge des différentes docs... reste à relire/vérifier tout ça
This commit is contained in:
parent
955c0efba3
commit
4817a0f0cb
192
HowtoPHP.md
192
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
|
# 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
|
## FAQ
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue