8
votes

meilleure façon de mesurer (et d'affiner) la performance avec PHP?

Un site que je travaille commence à obtenir un peu de lents et je voudrais le raffiner. Je pense que le problème est avec le PHP, mais je ne peux pas en être sûr. Comment puis-je voir combien de temps les fonctions prises pour effectuer?


1 commentaires

jeter un coup d'œil à Stackoverflow.com/Questtions/55720/...


6 Réponses :


5
votes

Essayez la fonctionnalité du profileur dans Xdebug ou Zend Debugger?


2 commentaires

Y a-t-il une grande partie d'une courbe d'apprentissage pour les utiliser? Actuellement, j'utilise une combinaison de textmate, Firefox, Firebug et FirephP (un dieu envoie !!)


Xdebug et Zend Debugger sont dans une ligue différente par rapport à votre configuration actuelle. J'ai trouvé Zend Debugger très facile à utiliser (j'ai utilisé Zend Studio). Si vous voulez une optimisation sérieuse, je vous recommanderais d'y aller avec l'un.



1
votes

Deux choses que vous pouvez faire. Placez les appels Microtime partout bien que ce n'est pas pratique si vous souhaitez tester plusieurs fonctions. Donc, il y a un moyen plus simple de faire une meilleure solution si vous voulez tester de nombreuses fonctions que je suppose que vous aimeriez faire. Il suffit d'avoir une classe (cliquez sur le lien pour suivre le tutoriel) où vous pouvez tester combien de temps toutes vos fonctions prennent. Plutôt que de placer microtime partout. Vous utilisez simplement cette classe. qui est très pratique

http://codeaid.net / PHP / Calculez-Script-EXECUTION-EXÉCUTION-TIME-% 28PL-CLASSE% 29 P>

La deuxième chose que vous pouvez faire est d'optimiser votre script consiste à examiner l'utilisation de la mémoire. En observant l'utilisation de la mémoire de vos scripts, vous pourrez peut-être optimiser votre code mieux. P>

PHP a un collecteur à déchets et un gestionnaire de mémoire assez complexe. La quantité de mémoire utilisée par votre script. peut monter et descendre pendant l'exécution d'un script. Pour obtenir l'utilisation de la mémoire actuelle, nous pouvons utiliser la fonction memory_get_usage () et pour obtenir la quantité de mémoire la plus élevée utilisée à tout moment, nous pouvons utiliser la fonction memory_get_peak_USAGE (). Voir PlayCopy dans ClipboardPrint? P>

   echo "Initial: ".memory_get_usage()." bytes \n";  
   /* prints 
   Initial: 361400 bytes 
   */  

   // let's use up some memory  
   for ($i = 0; $i < 100000; $i++) {  
       $array []= md5($i);  
   }  

  // let's remove half of the array  
  for ($i = 0; $i < 100000; $i++) {  
     unset($array[$i]);  
  }  

  echo "Final: ".memory_get_usage()." bytes \n";  
  /* prints 
  Final: 885912 bytes 
  */  

  echo "Peak: ".memory_get_peak_usage()." bytes \n";  
  /* prints 
  Peak: 13687072 bytes 
  */  


0 commentaires

22
votes

Si vous souhaitez tester l'heure d'exécution:

<?php
    $startTime = microtime(true);  
    // Your content to test
    $endTime = microtime(true);  
    $elapsed = $endTime - $startTime;
    echo "Execution time : $elapsed seconds";
?>


0 commentaires

0
votes
  • Vous pouvez également le rendre manuellement, en enregistrant une valeur microtime () dans divers endroits, comme celui-ci: P>

    <?
    if ('127.0.0.1' === $_SERVER['REMOTE_ADDR']) {
      echo "<table border=1><tr><td>name</td><td>so far</td><td>delta</td><td>per cent</td></tr>";
      reset($TIMER);
      $start=$prev=current($TIMER);
      $total=end($TIMER)-$start;
      foreach($TIMER as $name => $value) {
        $sofar=round($value-$start,3);
        $delta=round($value-$prev,3);
        $percent=round($delta/$total*100);
        echo "<tr><td>$name</td><td>$sofar</td><td>$delta</td><td>$percent</td></tr>";
        $prev=$value;
      }
        echo "</table>";
    }
    ?>
    

3 commentaires

La raison pour laquelle je pense que c'est le backend, c'est parce que le profil de Firebug prend un certain temps. Il est à la traîne des appels vers le serveur. Cela le fait localement également, de sorte que cela me semble exclure des performances du serveur, même si je suis loin d'être experte avec des serveurs.


Les requêtes de la base de données sont gérées par l'API WordPress, alors je ne sais pas à quel point je peux passer sans réécriture de la roue, ce qui annulerait le point d'utiliser WordPress, dans un degré.


@Mild PHP Backend implique également des appels SQL bien sûr. SQL fait partie du travail backend. de toute façon, seul le profilage peut dire



0
votes

Votre meilleur pari est xdebug. Je suis heureux car il vient groupé dans mon IDE pHPED. Je peux obtenir des données de profiler en un clic d'un bouton.

Alors peut-être que vous pourriez considérer cela.


2 commentaires

Vous ne pouvez pas utiliser votre IDE précieux sur Profile Server distant. au moins à moins que la prolongation Xdebug est installée là-bas. Tout en profilant du serveur de développement local est presque inutile


Je dirais que le profilage localement est inutile. Bien que les données de performance ne soient pas les mêmes sur les deux machines, les proportions des charges restent donc, de sorte que vous pouvez toujours trouver le goulot d'étranglement.



0
votes

J'ai eu des problèmes similaires et j'ai donc créé 2 nouvelles tables sur la base de données et deux nouvelles fonctions. L'un était audit_sql et l'autre était audit_code. Parce que j'ai utilisé une classe d'abstraction SQL, il était facile de chaque appel SQL (j'ai utilisé PHP Microtime comme certains d'autres ont suggéré). Donc, j'ai appelé Microtime avant et après l'appel SQL et stocké les résultats sur la base de données.

De même avec les pages. J'ai appelé Microtime au début et à la fin de chaque page et si nécessaire au début et à la fin des fonctions, divs - tout ce que je pensais être un coupable.

Les résultats généraux étaient:

  1. Les appels SQL à MySQL étaient presque instantanés et étaient un problème du tout. La seule chose que je dirais, c'est que même j'étais surpris du nombre d'être exécutés! Le site est généré à partir de la base de données - même les menus, les autorisations, etc. pour produire la page d'accueil Les appels SQL ont été mesurés dans les 100s.

  2. php n'était pas le coupable. C'était encore plus instantané que mysql.

  3. Le coupable était .... (grand accumulation!) Appels vers vous Tube et Picassa et d'autres sites comme ça. Je héberge des vidéos et des albums de photos sur le site (Eh bien, je ne les stocke pas réellement - ils sont stockés sur YT, etc.) et sur la page d'accueil sont des vignettes extraites de votre tube et similaires via le tube PHP API PHP / Zend-cadre. Comme il s'agit de tout HTTP basé sur les autres sites, chacun prenait 1, 2 ou 3 secondes. Cela causait ces divs contenant ceux-ci de prendre entre 6 et 12 secondes et la page d'accueil jusqu'à 17 secondes.

    La solution - stockez toutes les vignettes sur mon serveur. La première fois que l'on doit être servi à partir du site distant (YT, Picassa, etc.), donc le faire, puis le stocker sur votre propre site. Times futurs, vous vérifiez si vous l'avez et si vous le servez toujours à partir de votre serveur. Coupe la page de chargement de la page jusqu'à 2-3 secondes. Accordé à la première personne à afficher la première charge de la page d'accueil après que quelqu'un a chargé plus de vidéos / images prendra du temps, mais pas par la suite. Les gens mettront une longue période de chargement d'une page unique à leur connexion / Internet en général. Trop de charges lentes de votre site et ils vont arrêter de visiter!

    J'espère que cela aide quelque peu.


0 commentaires