155 votes

Comment évaluer l'efficacité du script PHP

Je veux savoir quelle est la meilleure façon de comparer mes scripts PHP. N'a pas d'importance si une tâche cron, ou une page web ou d'un service web.

Je sais que je peux utiliser microtime mais est-ce vraiment de me donner le temps réel d'un script PHP?

Je veux tester et comparer différentes fonctions en PHP qui font la même chose. Par exemple, preg_match vs strpos ou domdocument vs preg_match ou preg_replace vs str_replace`

Exemple d'une page web:

<?php
// login.php

$start_time = microtime(TRUE);

session_start(); 
// do all my logic etc...

$end_time = microtime(TRUE);

echo $end_time - $start_time;

Cela permettra de sortie: 0.0146126717 (varie tout le temps - mais c'est le dernier que j'ai eu). Cela signifie qu'il a pris 0.015 ou afin d'exécuter le script PHP.

Est-il un meilleur moyen?

135voto

James Butler Points 2772

Si vous voulez vraiment de référence du monde réel code, utiliser des outils comme Xdebug et XHProf.

Xdebug est idéal lorsque vous travaillez dans dev/mise en scène, et XHProf est un excellent outil pour la production et il est sûr pour l'exécuter (tant que vous avez lu les instructions). Les résultats d'un seul chargement de la page ne va pas être aussi pertinent que de voir comment votre code effectue alors que le serveur est martelé à faire d'un million d'autres choses aussi bien et que les ressources deviennent rares. Cela soulève une autre question: êtes-vous de la congestion sur le CPU? La mémoire RAM? I/O?

Vous avez aussi besoin de regarder au-delà de tout juste le code que vous sont en cours d'exécution dans vos scripts à la façon dont vos scripts/pages sont servies. Ce serveur web utilisez-vous? Comme exemple, je peux faire de nginx + PHP-FPM sérieusement à effectuer des mod_php + Apache, qui à son tour est battue pour servir du contenu statique en utilisant une bonne CAN.

La prochaine chose à considérer est ce que vous essayez d'optimiser?

  • Est la vitesse à laquelle la page est affichée dans le navigateur d'utilisateurs de l' la priorité numéro un?
  • Est l'obtention de chaque requête au serveur rejetée en arrière aussi vite qu' possible avec le plus petit de la consommation CPU de l'objectif?

L'ancien peut être aidé par faire des choses comme gzipping toutes les ressources de l'envoyer au navigateur, mais cela pourrait (dans certaines circonstances) vous pousser plus loin de la réalisation de ce dernier.

Espérons que tous les ci-dessus peut aider à montrer que soigneusement isolé " lab " test ne reflète pas les variables et les problèmes que vous rencontrerez dans la production, et que vous devez identifier ce que votre haut niveau de l'objectif et puis ce que vous pouvez faire pour y arriver, avant de se diriger vers le bas de la micro/prématuré-optimisation de la route de l'enfer.

81voto

Book Of Zeus Points 38130

À l'indice de référence de la rapidité de votre script complet s'exécute sur le serveur, il existe de nombreux outils que vous pouvez utiliser. Assurez-vous d'abord de votre script (preg_match vs strpos par exemple), pour produire les mêmes résultats, afin de bénéficier de votre test.

Vous pouvez utiliser:

31voto

Alec Gorge Points 6875

Vous aurez envie de regarder Xdebug et, plus précisément, Xdebug de fonctionnalités de profiling.

Fondamentalement, vous activez le générateur de profils, et chaque fois que vous chargez une page web, il crée un cachegrind fichier qui peut être lu avec WinCacheGrind ou KCacheGrind.

Xdebug peut être un peu complexe à configurer, donc voici la partie de mon php.ini pour la référence:

[XDebug]
zend_extension = h:\xampp\php\ext\php_xdebug-2.1.1-5.3-vc6.dll
xdebug.remote_enable=true
xdebug.profiler_enable_trigger=1
xdebug.profiler_output_dir=h:\xampp\cachegrind
xdebug.profiler_output_name=callgrind.%t_%R.out

Et voici une capture d'écran d'un .out le fichier dans WinCacheGrind:

enter image description here

Que doit fournir suffisamment de détails sur la façon efficace de votre script PHP. Vous souhaitez cibler les choses qui prennent le plus de temps. Par exemple, vous pouvez optimiser une fonction à prendre la moitié de la quantité de temps, mais vos efforts seraient mieux servis en optimisant une fonction qui est appelé des dizaines, voire des centaines de fois au cours d'un chargement de page.

Si vous êtes curieux, c'est juste une ancienne version d'un CMS que j'ai écrit pour mon propre usage.

19voto

fotuzlab Points 494

Essayez https://github.com/fotuzlab/appgati

Il permet de définir les étapes à la fois de code et rapports, utilisation de la mémoire, chargement du serveur etc. entre deux étapes.

Quelque chose comme :

Tableau de sortie l’échantillon :

7voto

Till Points 14673

Je regarde dans xhprof. Il n'a pas d'importance si elle est exécutée sur l'interface cli ou via un autre sapi (comme fpm ou fcgi ou même le module Apache).

La meilleure partie au sujet de xhprof, c'est que c'est encore assez en forme pour être exécuté dans la production. Quelque chose qui ne fonctionne pas aussi bien avec xdebug (la dernière fois que j'ai vérifié). xdebug a un impact sur la performance et xhprof (je ne dirais pas qu'il n'y a aucun) gère beaucoup mieux.

Nous utilisons fréquemment xhprof pour recueillir des échantillons avec le trafic réel et d'analyser le code à partir de là.

Ce n'est pas vraiment une référence dans les conditions qu'il vous procure un moment et tout ça, mais il le fait aussi bien. C'est juste qu'il est très facile d'analyser la production de trafic et de forage vers le bas pour la fonction php de niveau dans le callgraph recueillies.

Une fois que l'extension est compilé et chargé de commencer le profilage dans le code avec:

xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

Pour arrêter:

$xhprof_data = xhprof_disable();

Puis enregistrez les données dans un fichier ou une base de données - ce que les flotteurs de votre serment et ne pas perturber l'habitude de l'exécution. Nous asynchrone pousser à S3 de centraliser les données (pour être en mesure de voir toutes les courses de l'ensemble de nos serveurs).

Le code sur github contient un xhprof_html dossier qui vous vider sur le serveur et avec un minimum de configuration, vous pouvez visualiser les données collectées et commencer à forer vers le bas.

HTH!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X