Quelle est la façon la plus simple de profiler un script PHP?
J'adorerais ajouter quelque chose qui me montre un vidage de tous les appels de fonction et combien de temps ils ont pris, mais je suis également d'accord pour mettre quelque chose autour de fonctions spécifiques.
J'ai essayé d'expérimenter la fonction microtime :
$then = microtime();
myFunc();
$now = microtime();
echo sprintf("Elapsed: %f", $now-$then);
mais cela me donne parfois des résultats négatifs. De plus, c'est beaucoup de mal à saupoudrer cela sur tout mon code.
microtime()
conduira à l' évaluation des expressions comme parfois:"0.00154800 1342892546" - "0.99905700 1342892545"
, qui évaluera comme:0.001548 - 0.999057
. Vous pouvez utilisermicrotime( TRUE )
pour éviter ce problème, comme l'a souligné @luka.Réponses:
L' extension PECL APD est utilisée comme suit:
Ensuite, analysez le fichier généré à l'aide de
pprofp
.Exemple de sortie:
Avertissement: la dernière version d'APD est datée de 2004, l'extension n'est plus maintenue et présente divers problèmes de compatibilité (voir commentaires).
la source
pecl install apd
, elle donne un message d'erreur sur "config.m4". Il semble que vous devez l'installer à partir des sources, ce que je n'ai pas encore essayé. Sérieusement, n'y a-t-il pas un outil de profilage CLI moderne et mis à jour pour PHP qui s'installe avec Homebrew, nécessite une configuration minimale et donne une sortie facilement lisible par l'homme?Tu veux xdebug je pense. Installez-le sur le serveur, allumez-le, pompez la sortie via kcachegrind (pour linux) ou wincachegrind (pour windows) et il vous montrera quelques jolis graphiques qui détaillent les horaires exacts, les nombres et l'utilisation de la mémoire (mais vous besoin d'une autre extension pour cela).
Ça berce, sérieusement: D
la source
Aucune extension n'est nécessaire, utilisez simplement ces deux fonctions pour un profilage simple.
Voici un exemple, appelant prof_flag () avec une description à chaque point de contrôle, et prof_print () à la fin:
La sortie ressemble à ceci:
Démarrer
0,004303
Se connecter à la base de données
0,003518
Effectuer la requête
0,000308
Récupérer les données
0,000009
Fermer la base de données
0,000049
Terminé
la source
Cross poster ma référence à partir de la version bêta de la documentation SO qui est hors ligne.
Profilage avec XDebug
Une extension de PHP appelée Xdebug est disponible pour aider au profilage des applications PHP , ainsi qu'au débogage d'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 plateforme pour analyser ces fichiers. Aucune modification du code d'application n'est nécessaire pour effectuer ce profilage.
Pour activer le profilage, installez l'extension et ajustez les paramètres php.ini. Certaines distributions Linux sont livrées avec des packages standard (par exemple le
php-xdebug
package d'Ubuntu ). Dans notre exemple, nous exécuterons le profil facultativement en fonction d'un paramètre de demande. Cela nous permet de garder les paramètres statiques et d'activer le profileur uniquement si nécessaire.Utilisez ensuite un client Web pour faire une demande à l'URL de votre application que vous souhaitez profiler, par exemple
Au fur et à mesure que la page traite, elle écrit dans un fichier avec un nom similaire à
Par défaut, le numéro dans le nom de fichier est l'identifiant du processus qui l'a écrit. Ceci est configurable avec le
xdebug.profiler_output_name
paramètre.Notez qu'il écrira 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 pour afficher le formulaire HTML. Le paramètre XDEBUG_PROFILE devra être passé dans la demande POST suivante pour analyser la deuxième demande qui traite le formulaire. Par conséquent, lors du profilage, il est parfois plus facile d'exécuter curl pour POSTER directement un formulaire.
Analyse de la sortie
Une fois écrit, le cache de profil peut être lu par une application telle que KCachegrind ou Webgrind . PHPStorm, un IDE PHP populaire, peut également afficher ces données de profilage .
KCachegrind, par exemple, affichera des informations, notamment:
Ce qu'il faut chercher
De toute évidence, l'optimisation des performances est très spécifique aux cas d'utilisation de chaque application. En général, il est bon de rechercher:
Remarque : Xdebug, et en particulier ses fonctionnalités de profilage, sont très gourmandes en ressources et ralentissent l'exécution PHP. Il est recommandé de ne pas les exécuter dans un environnement de serveur de production.
la source
Si la soustraction de microtimes vous donne des résultats négatifs, essayez d'utiliser la fonction avec l'argument
true
(microtime(true)
). Avectrue
, la fonction renvoie un flottant au lieu d'une chaîne (comme elle le fait si elle est appelée sans arguments).la source
Honnêtement, je vais faire valoir que l'utilisation de NewRelic pour le profilage est la meilleure.
C'est une extension PHP qui ne semble pas du tout ralentir le temps d'exécution et ils font la surveillance pour vous, permettant une exploration décente. Dans la version onéreuse, ils permettent une analyse approfondie (mais nous ne pouvons pas nous permettre leur modèle de tarification).
Pourtant, même avec le plan gratuit / standard, il est évident et simple où la plupart des fruits suspendus sont. J'aime aussi le fait que cela puisse aussi vous donner une idée sur les interactions DB.
la source
Profilage du pauvre, aucune extension requise. Prend en charge les profils imbriqués et le pourcentage du total:
Exemple:
Rendements:
la source
PECL XHPROF semble également intéressant. Il a une interface HTML cliquable pour afficher les rapports et une documentation assez simple . Je dois encore le tester.
la source
J'aime utiliser phpDebug pour le profilage. http://phpdebug.sourceforge.net/www/index.html
Il génère toute l'utilisation du temps / de la mémoire pour tout SQL utilisé ainsi que tous les fichiers inclus. De toute évidence, cela fonctionne mieux sur du code abstrait.
Pour le profilage des fonctions et des classes, je vais simplement utiliser
microtime()
+get_memory_usage()
+get_peak_memory_usage()
.la source
J'essaierais avec défi BlackFire .
Il y a cette virtualBox que j'ai composée à l' aide de puphpet , pour tester différents frameworks php qui viennent avec BlackFire, n'hésitez pas à forker et / ou distribuer si nécessaire :)
https://github.com/webit4me/PHPFrameworks
la source
Pour l'analyse comparative, comme dans votre exemple, j'utilise le package pear Benchmark . Vous définissez des marqueurs pour mesurer. La classe fournit également quelques assistants de présentation, ou vous pouvez traiter les données comme bon vous semble.
Je l'ai en fait enveloppé dans une autre classe avec une méthode __destruct. Lorsqu'un script se termine, la sortie est enregistrée via log4php dans syslog, j'ai donc beaucoup de données de performance à partir desquelles je peux travailler.
la source
XDebug n'est pas stable et n'est pas toujours disponible pour une version php particulière. Par exemple, sur certains serveurs, je lance toujours php-5.1.6, - c'est ce qui vient avec RedHat RHEL5 (et btw reçoit toujours des mises à jour pour tous les problèmes importants), et le récent XDebug ne compile même pas avec ce php. J'ai donc fini par passer au débogueur DBG. Son benchmark php fournit le timing des fonctions, des méthodes, des modules et même des lignes.
la source
Vous devriez certainement vérifier ce nouveau profileur php.
https://github.com/NoiseByNorthwest/php-spx
Il redéfinit la façon dont les profileurs php collectent et présentent le résultat. Au lieu de générer uniquement un nombre total d'appels de fonction particuliers et le temps total passé à l'exécuter - PHP-SPX présente l'intégralité de la chronologie de l'exécution de la demande d'une manière parfaitement lisible. Voici l'écran de l'interface graphique qu'il fournit.
la source