Utiliser xhprof avec Drupal et Devel

Rencontrant de gros soucis de performances depuis quelques temps sur un site, j’ai utilisé xhprof pour trouver le souci, et le problème m’a sauté aux yeux grâce à cet outil !

sudo apt-get install php5-dev
sudo pecl install xhprof-beta

# notez juste apres, l'emplacement du fichier xhprof.so, ca aide.
cd /etc/php5/apache2/conf.d
sudo vi 20-xhprof.ini

Coller la ligne pointant sur votre fichier .so

# Repertoire a parametrer selon vos
extension=/usr/lib/php5/20121212/xhprof.so
xhprof.output_dir=/tmp/xhprof

A priori, sous Ubuntu en tout cas, le répertoire est bien en 777, sinon, pensez à bien régler les droits pour qu’Apache puisse écrire dedans (www-data ou autre).

Redémarrer Apache2 (sudo service apache2 restart)

Accéder à la configuration de devel :
http://(…)/admin/config/development/devel

Paramétrer les répertoires demandés :
xhprof directory = /usr/share/php
XHProf URL = /xhprof_html

Cocher la case désormais active : « Activer le profilage (profiling) (…) »

Devel settings   Homair vacances

Vous avez alors un lien apparaissant en bas de chaque page, permettant d’accéder au rapport généré correspondant (un par processus Apache/requête HTTP du script PHP).

Exemple de rapport (le mien, posant souci)

XHProf  Hierarchical Profiler Report

La liste des rapports est accessible via l’URL générale : http://localhost/xhprof_html

C’est simplement la liste des fichiers présents dans l’output_dir de xhprof.

Ca permet aussi d’accéder aux rapports a posteriori (même si on a quitté la page concernée).

XDebug

Vous pouvez faire de même sans le module DEVEL, juste avec xdebug par exemple.
Le principe est le même : activer le profiler d’XDebug, qui génère pour chaque processus Apache, un fichier datagrind.out dans le répertoire paramétré. La différence est qu’il faut un outil externe pour les lire : Wincachegrind ou KCacheGrind (j’ai pas testé ce dernier sous Ubuntu car sous Gnome… et pas envie d’installer 10M de packages KDE juste pour ça. Donc sous windows, ça fonctionne très bien : faut pas toujours cracher sur Microsoft non plus 😉 )

La navigation dans le rapport est encore plus sympa et ergonomique.

PS : concernant mon problème de performance dont le rapport s’affiche ci-dessus, il s’agissait de l’utilisation du module uglifyjs, qui parfois, pour compresser les fichiers, prenait 30s / fichier, car utilisant un webservice sur http://uglifyjs.me. Autant vous dire que le module n’existe plus dans mon projet désormais…