PHP
Performance
Recherche…
Profilage avec XHProf
XHProf est un profileur PHP initialement écrit par Facebook, pour fournir une alternative plus légère à XDebug.
Après avoir installé le module PHP xhprof
, le profilage peut être activé / désactivé à partir du code PHP:
xhprof_enable();
doSlowOperation();
$profile_data = xhprof_disable();
Le tableau renvoyé contiendra des données sur le nombre d'appels, le temps processeur et l'utilisation de la mémoire de chaque fonction à laquelle on a accédé dans doSlowOperation()
.
xhprof_sample_enable()
/ xhprof_sample_disable()
peut être utilisé comme une option plus légère qui enregistrera uniquement les informations de profilage pour une fraction des demandes (et dans un format différent).
XHProf a des fonctions d'aide (la plupart du temps non documentées) pour afficher les données ( voir l'exemple ), ou vous pouvez utiliser d'autres outils pour le visualiser (le blog platform.sh a un exemple ).
Utilisation de la mémoire
La limite de mémoire d'exécution de PHP est définie par la directive INI memory_limit
. Ce paramètre empêche toute exécution de PHP d'utiliser trop de mémoire, l'épuisant pour d'autres scripts et logiciels système. La limite de mémoire par défaut est 128M et peut être modifiée dans le fichier php.ini
ou à l'exécution. Il peut être paramétré pour ne pas avoir de limite, mais cela est généralement considéré comme une mauvaise pratique.
L'utilisation exacte de la mémoire utilisée lors de l'exécution peut être déterminée en appelant memory_get_usage()
. Il renvoie le nombre d'octets de mémoire alloués au script en cours d'exécution. Depuis PHP 5.2, il possède un paramètre booléen optionnel pour obtenir la mémoire système totale allouée, contrairement à la mémoire utilisée activement par PHP.
<?php
echo memory_get_usage() . "\n";
// Outputs 350688 (or similar, depending on system and PHP version)
// Let's use up some RAM
$array = array_fill(0, 1000, 'abc');
echo memory_get_usage() . "\n";
// Outputs 387704
// Remove the array from memory
unset($array);
echo memory_get_usage() . "\n";
// Outputs 350784
Maintenant, memory_get_usage
vous permet d'utiliser la mémoire au moment de son exécution. Entre les appels à cette fonction, vous pouvez allouer et libérer d'autres choses en mémoire. Pour obtenir la quantité maximale de mémoire utilisée jusqu'à un certain point, appelez memory_get_peak_usage()
.
<?php
echo memory_get_peak_usage() . "\n";
// 385688
$array = array_fill(0, 1000, 'abc');
echo memory_get_peak_usage() . "\n";
// 422736
unset($array);
echo memory_get_peak_usage() . "\n";
// 422776
Notez que la valeur ne montera ou ne restera pas constante.
Profilage avec Xdebug
Une extension de PHP appelée Xdebug est disponible pour vous aider à profiler les applications PHP , ainsi que le débogage à l'exécution. Lors de l'exécution du profileur, la sortie est écrite dans un fichier au format binaire appelé "cachegrind". Des applications sont disponibles sur chaque plate-forme pour analyser ces fichiers.
Pour activer le profilage, installez l'extension et ajustez les paramètres php.ini. Dans notre exemple, nous allons exécuter le profil sur la base d’un paramètre de requête. Cela nous permet de conserver les paramètres statiques et d’activer le profileur uniquement si nécessaire.
// Set to 1 to turn it on for every request
xdebug.profiler_enable = 0
// Let's use a GET/POST parameter to turn on the profiler
xdebug.profiler_enable_trigger = 1
// The GET/POST value we will pass; empty for any value
xdebug.profiler_enable_trigger_value = ""
// Output cachegrind files to /tmp so our system cleans them up later
xdebug.profiler_output_dir = "/tmp"
xdebug.profiler_output_name = "cachegrind.out.%p"
Ensuite, utilisez un client Web pour faire une demande à l’URL de votre application que vous souhaitez profiler, par exemple
http://example.com/article/1?XDEBUG_PROFILE=1
Comme la page traite, il va écrire dans un fichier avec un nom similaire à
/tmp/cachegrind.out.12345
Notez qu'il va écrire un fichier pour chaque requête / processus PHP exécuté. Ainsi, par exemple, si vous souhaitez analyser une publication de formulaire, un profil sera écrit pour la demande GET afin d'afficher le formulaire HTML. Le paramètre XDEBUG_PROFILE devra être transmis à la requête POST suivante pour analyser la deuxième requête qui traite le formulaire. Par conséquent, lors du profilage, il est parfois plus facile d'exécuter curl pour POST directement un formulaire.
Une fois écrit, le cache de profil peut être lu par une application telle que KCachegrind.
Cela affichera des informations, y compris:
- Fonctions exécutées
- Heure d'appel, à la fois elle-même et comprenant les appels de fonction ultérieurs
- Nombre de fois où chaque fonction est appelée
- Graphes d'appel
- Liens vers le code source
De toute évidence, le réglage des performances est très spécifique aux cas d'utilisation de chaque application. En général, il est bon de chercher:
- Appels répétés à la même fonction que vous ne vous attendez pas à voir. Pour les fonctions qui traitent et interrogent des données, celles-ci peuvent constituer des opportunités de choix pour votre application en cache.
- Fonctions lentes Où l'application passe-t-elle le plus de temps? le meilleur rapport qualité-prix de l'optimisation des performances se concentre sur les parties de l'application qui consomment le plus de temps.
Remarque : Xdebug, et en particulier ses fonctionnalités de profilage, consomment beaucoup de ressources et ralentit l’exécution de PHP. Il est recommandé de ne pas les exécuter dans un environnement de serveur de production.