Profili le pagine PHP lente in produzione

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

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

Ho usato il profiler Xdebug prima, ma davvero non voglio 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.

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

Facile e senza grandi perdite sul tuo server di produzione.

È ansible scrivere le dichiarazioni del timer sono parti delle pagine lente per restringere. 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); } 

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

Potrebbe soddisfare le tue esigenze

Sarei dispiaciuto di un'intera 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 get un tempo molto preciso per each 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 aggiunto automaticamente. È quindi ansible 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 */ } 

Ti suggerisco di dare un'occhiata al progetto webgrind . È ansible triggersre il profiling per-query, che potrebbe consentire di get dati di profilatura dal proprio server di produzione senza un enorme impatto sulle performance.

Spero che questo ti possa aiutare

So che questa non è la soluzione migliore, ma …

Puoi creare una class helper per registrare each process che hai, insieme a ora di inizio e di fine. So che lo fai già per l'integer process, ma per each function inizio e fine puoi aggiungere un "Profiler :: logtime ( FUNC )";