2010-10-28 4 views
6

Existe-t-il un moyen de profiler uniquement les pages PHP lentes sur un serveur de production? Pour l'instant, nous enregistrons des pages lentes dans un fichier texte, mais sans plus d'informations, il est difficile de dire pourquoi elles sont lentes (pas toujours lentes).Pages PHP lentes en production

J'ai utilisé le profileur Xdebug auparavant, mais je ne veux vraiment pas l'activer sur nos serveurs de production, car nous sommes susceptibles d'obtenir 100 demandes par seconde. J'ai également utilisé Zend Platform, mais je ne veux pas vraiment l'installer à nouveau.

+0

Si vous utilisez mysql, assurez-vous que "slow query log" est actif. – c0rnh0li0

Répondre

3

Vous pouvez modifier les journaux de votre serveur Apache/HTTP pour enregistrer le temps passé à traiter chaque requête. Suivez this guide par exemple. Ensuite, vous pouvez rassembler des données sur la durée de chaque requête, identifier les pages/demandes lentes et utiliser XDebug ou WebGrind pour analyser les causes.

Facile, et pas de grande consommation sur votre serveur de production.

+0

Génial, il y a un lien dans les commentaires à mod-log-firstbyte - http://code.google.com/p/mod-log-firstbyte/ qui devrait se connecter au temps de traitement du journal apache. – Noodles

+0

Je ne peux pas dire que j'y avais pensé, mais encore mieux de ne consigner que le temps que prend votre serveur lui-même pour distribuer une ressource. – Ghostpsalm

2

Vous pouvez écrire des instructions de temporisation qui font partie des pages lentes pour les réduire. Ensuite, une fois que certaines données sont accumulées, rincez et répétez.

define('START_TIME', microtime(true)); 
function timer() { 
    static $last; 
    $time_since_start = microtime(true) - START_TIME; 
    $time_since_last = microtime(true) - $last; 
    // Do something with $time vars 
    $last = microtime(true); 
} 

Consultez également ceci: http://particletree.com/features/php-quick-profiler/

Il peut répondre à vos besoins

+0

PQP est beau et joli, mais ça ne me donne pas vraiment le détail que je recherchais. Merci quand même. – Noodles

0

Je serais circonspect de d'une nouvelle bibliothèque pour un serveur de production entier. Quand je débogue, j'aime utiliser les directives * auto_prepend_file * et * auto_append_file * dans php.ini. Vous pouvez facilement faire comme suggéré ci-dessus avec cette méthode et obtenir un temps très précis pour chaque chargement de la page. Si vous ne vous inquiétez que pour les pages à chargement lent en secondes, voici une solution rapide et sale qui soustrait le temps de requête du serveur de l'heure de fin approximative dans un fichier auto-ajouté. Vous pouvez ensuite stocker le résultat dans un fichier DB ou un fichier plat.

par exemple dans php.in

auto_append_file = [location]/my_timer.php 

my_timer.php

define('TRIGGER_TIME_LOG','3'); // Minimum number of timer seconds to log page load 

$time = time() - $_SERVER['REQUEST_TIME']; // Page load time 

if($time >= TRIGGER_TIME_LOG) 
{ 
    /* 
    * DO LOGGING TO DB OR FLAT FILE HERE 
    */ 
} 
+0

Comme je l'ai dit, nous enregistrons déjà des pages lentes, j'ai juste besoin de plus de détails (comme les fonctions qui sont lentes). – Noodles

+0

Désolé, j'ai mal compris. – DrPerdix

0

je vous suggère de jeter un oeil à la webgrind project. Vous pouvez activer le profilage par requête, ce qui vous permettrait peut-être d'obtenir des données de profilage à partir de votre serveur de production sans avoir un énorme impact sur les performances.

J'espère que cela vous aidera

+0

Le problème est que nous ne savons pas où sont les ralentissements.Nous avons vraiment besoin de quelque chose qui permettrait d'identifier les pages lentes comme Zend Platform, mais quelque chose qui ne coûte pas des milliers de dollars par an. – Noodles

0

Je sais que ce n'est pas la meilleure solution, mais ...

Vous pouvez créer une classe d'aide pour connecter tous les processus que vous avez, avec début et de fin . Je sais que vous le faites déjà pour tout le processus, mais pour chaque fonction de début et de fin, vous pouvez ajouter un "Profiler :: logtime (FUNC)";