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