2010-10-28 11 views
6

C'è un modo di profilare solo le pagine lente PHP su un server di produzione?Profilo pagine PHP lente in produzione

Al momento stiamo registrando pagine lente in un file di testo, ma senza ulteriori informazioni è difficile dire perché sono lenti (non costantemente lenti).

Ho già utilizzato il profiler Xdebug, ma non desidero abilitarlo sui nostri server di produzione poiché è probabile che riceviamo centinaia di richieste al secondo. Ho anche usato Zend Platform, ma non voglio installarlo di nuovo.

+0

Nel caso si stia utilizzando mysql, assicurarsi che "log delle query lente" sia attivo. – c0rnh0li0

risposta

3

È possibile modificare i log del server Apache/HTTP per registrare il tempo impiegato per ogni richiesta. Segui this guide per esempio. Quindi è possibile raccogliere i dati per quanto tempo richiede ciascuna richiesta, identificare le pagine lente/richieste e utilizzare XDebug o WebGrind per analizzare ulteriormente le cause.

Facile, e nessun grande scarico sul server di produzione.

+0

Impressionante, c'è un collegamento nei commenti a mod-log-firstbyte - http://code.google.com/p/mod-log-firstbyte/ che dovrebbe accedere al tempo di elaborazione del log di apache. – Noodles

+0

Non posso dire di averlo pensato, ma è anche meglio registrare solo il tempo impiegato dal server per fornire una risorsa. – Ghostpsalm

2

È possibile scrivere le dichiarazioni del timer come parti delle pagine lente per restringerlo. Quindi, una volta che alcuni dati sono stati creati, risciacqua e ripeti.

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); 
} 

Verificate anche questo: http://particletree.com/features/php-quick-profiler/

Potrebbe adatto alle vostre esigenze

+0

PQP sembra bello e carino, ma in realtà non mi dà il dettaglio che cercavo. Grazie comunque. – Noodles

0

mi piacerebbe essere diffidenti di di una nuova libreria per un server di produzione. Quando eseguo il debug mi piace usare le direttive * auto_prepend_file * e * auto_append_file * in php.ini. Si potrebbe facilmente fare come suggerito sopra con questo metodo e ottenere un tempo molto preciso per ogni caricamento della pagina.

Se si è preoccupati solo delle pagine di caricamento lento misurate in secondi, ecco una soluzione rapida e sporca che sottrae il tempo di richiesta del server dal tempo di finitura approssimativo in un file auto-aggiunto. È quindi possibile memorizzare il risultato in un file db o flat.

ad esempio in 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

Come ho già detto, stiamo già registrando pagine lente, ho solo bisogno di maggiori dettagli (come le funzioni lente). – Noodles

+0

Mi dispiace, ho frainteso. – DrPerdix

0

vi suggerisco di dare un'occhiata al webgrind project. È possibile attivare il profiling per-query, che potrebbe consentire di ottenere dati di profilatura dal proprio server di produzione senza un enorme impatto sulle prestazioni.

Spero che questo vi aiuterà a

+0

Il problema è che non sappiamo dove siano i rallentamenti.Abbiamo davvero bisogno di qualcosa che possa identificare le pagine lente come fa la piattaforma Zend, ma qualcosa che non costa migliaia di dollari l'anno. – Noodles

0

So che questa non è la soluzione migliore, ma ...

È possibile creare una classe di supporto per registrare ogni processo che si possiede, insieme con inizio e di fine . So che lo fai già per l'intero processo, ma per ogni funzione inizio e fine puoi aggiungere un "Profiler :: logtime (FUNC)";