Domanda

Ecco la mia prima domanda a SO.

Ho un'applicazione interna per la mia azienda che recentemente mi è stato chiesto di mantenere.Le applicazioni sono costruite in PHP e sono abbastanza ben codificate (OO, DB Abstraction, Smarty) niente di WTF.

Il problema è che le applicazioni lo sono molto lento.

Come posso scoprire cosa rallenta l'applicazione?Ho ottimizzato il codice per eseguire pochissime query DB, quindi so che è il codice PHP che impiega un po' di tempo per essere eseguito.Ho bisogno di ottenere alcuni strumenti che possano aiutarmi in questo e devo escogitare una strategia per controllare il mio codice.

Posso eseguire da solo il lavoro di controllo/strategia, ma ho bisogno di più strumenti PHP per capire dove la mia app sta facendo schifo.

Pensieri?

È stato utile?

Soluzione

ho usato Profilazione XDebug recentemente in una situazione simile.Genera un report completo del profilo che può essere letto con molte app di profilazione comuni (non posso darti un elenco però, ho usato solo quello fornito con Slackware).

Altri suggerimenti

Come ha detto Juan, xDebug è eccellente.Se utilizzi Windows, WinCacheGrind ti consentirà di esaminare i rapporti.

Guarda questa presentazione di Rasmus Lerdorf (creatore di PHP).Fornisce alcuni buoni esempi di test della velocità di PHP e cosa cercare, nonché alcuni aspetti interni che possono rallentare le cose.XDebug è uno strumento che usa.Inoltre sottolinea molto bene il costo delle prestazioni con i framework.

Video:http://www.archive.org/details/simple_is_hard

Diapositive (poiché è difficile vederle nel video):http://talks.php.net/show/drupal08/1

Esistono molte variabili che possono influire sulle prestazioni della tua applicazione.Ti consiglio di non dare subito per scontato che PHP sia il problema.

Innanzitutto, come stai servendo PHP?Hai provato l'ottimizzazione di base di Apache o IIS stesso?Il server è occupato nell'elaborazione di altri tipi di richieste?Hai approfittato di a Acceleratore di codice PHP?Un modo per verificare se il server rappresenta il collo di bottiglia è provare a eseguire l'applicazione su un altro server.

In secondo luogo, le prestazioni dell'intera applicazione sono lente o sembrano influenzare solo alcune pagine?Questo potrebbe darti un'indicazione su dove iniziare ad analizzare le prestazioni.Se l'intera applicazione è lenta, il problema è più probabile nel server/piattaforma sottostante o in una query SQL globale che fa parte di ogni richiesta (ad esempio l'autenticazione dell'utente).

In terzo luogo, hai menzionato la riduzione al minimo del numero di query SQL, ma per quanto riguarda l'ottimizzazione delle query esistenti?Se utilizzi MySQL, stai sfruttando i vari punti di forza di ciascun sistema di storage?Hai corso SPIEGARE sulle tue query più importanti per assicurarti che siano indicizzate correttamente?Questo è fondamentale per le query che accedono a tabelle di grandi dimensioni;più grande è il set di dati, più noterai gli effetti di una scarsa indicizzazione.Fortunatamente ci sono molti articoli come questo che spiegano come utilizzare EXPLAIN.

In quarto luogo, un errore comune è presumere che il server del database utilizzi automaticamente tutte le risorse disponibili nel sistema.Dovresti verificare di aver allocato esplicitamente risorse sufficienti alla tua applicazione database.In MySQL, ad esempio, ti consigliamo di aggiungere impostazioni personalizzate (nel tuo file my.cnf) per cose come il buffer delle chiavi, la dimensione della tabella temporanea, la concorrenza dei thread, la dimensione del pool di buffer innodb, ecc.

Se hai ricontrollato tutto quanto sopra e non riesci ancora a trovare il collo di bottiglia, un profiler di codice come Xdebug può sicuramente aiutarti.Personalmente preferisco il profiler Zend Studio, ma potrebbe non essere l'opzione migliore a meno che tu non stia già sfruttando il resto dello stack della piattaforma Zend.Tuttavia, secondo la mia esperienza, è molto raro che PHP stesso sia la causa principale del rallentamento delle prestazioni.Spesso, un profiler di codice può aiutarti a determinare con maggiore precisione quali query DB sono da incolpare.

phpED (http://www.nusphere.com/products/phped.htm) offre anche ottimi debug e profilazione e la possibilità di aggiungere controlli, punti di interruzione, ecc. nel codice PHP.Il profiler integrato offre direttamente una suddivisione temporale di ciascuna chiamata di funzione e metodo di classe dall'interno dell'IDE.I plug-in del browser consentono inoltre una rapida integrazione con Firefox o IE (ad es.visitare l'URL lento con il browser, quindi fare clic sul pulsante per profilare o eseguire il debug).

È stato molto utile per evidenziare i punti in cui l'app è lenta in modo da concentrare la maggior parte dello sforzo di codifica;ed evita perdite di tempo nell'ottimizzazione di codici già veloci.Avendo provato Zend ed Eclipse, sono rimasto convinto della facilità d'uso di phpED.

Tieni presente che sia Xdebug che phpED (con DBG) richiederanno un modulo PHP aggiuntivo installato durante il debug su un server web.phpED offre anche (non provato da me) anche un'opzione di debug locale.

Il profilo Xdebug è sicuramente la strada da percorrere.Un altro suggerimento: WincacheGrind è buono, ma non è stato aggiornato di recente. http://code.google.com/p/webgrind/ - in un browser può essere un'alternativa facile e veloce.

È probabile, però, che si tratti comunque del database.Controlla gli indici rilevanti e che disponga di memoria sufficiente per memorizzare nella cache il maggior numero possibile di dati di lavoro.

Inoltre potresti usare APD (Debugger PHP avanzato).

È abbastanza facile farlo funzionare.

$ php apd-test.php

$ pprofp -l pprof.SOME_PID

Trace for /Users/martin/develop/php/apd-test/apd-test.php
Total Elapsed Time = 0.12
Total System Time  = 0.01
Total User Time    = 0.07


         Real         User        System             secs/    cumm
%Time (excl/cumm)  (excl/cumm)  (excl/cumm) Calls    call    s/call  Memory Usage Name
--------------------------------------------------------------------------------------
71.3 0.06 0.06  0.05 0.05  0.01 0.01  10000  0.0000   0.0000            0 in_array
27.3 0.02 0.09  0.02 0.07  0.00 0.01  10000  0.0000   0.0000            0 my_test_function
 1.5 0.03 0.03  0.00 0.00  0.00 0.00      1  0.0000   0.0000            0 apd_set_pprof_trace
 0.0 0.00 0.12  0.00 0.07  0.00 0.01      1  0.0000   0.0000            0 main

C'è un bel tutorial su come compilare APD ed effettuare la profilazione con esso: http://martinsikora.com/compiling-apd-for-php-54

se è una base di codice di grandi dimensioni, prova apc se non lo sei già.

http://pecl.php.net/package/APC

puoi anche provare a utilizzare la funzione Register_tick_function in php.che dice a php di chiamare periodicamente una determinata funzione attraverso il tuo codice.Potrai quindi tenere traccia di quale funzione è attualmente in esecuzione e del tempo che intercorre tra una chiamata e l'altra.quindi potresti vedere cosa sta impiegando più tempo.http://www.php.net/register_tick_function

Utilizziamo l'ambiente di sviluppo Zend (Windows).Ieri abbiamo risolto un picco di utilizzo della memoria esaminando il debugger durante l'esecuzione di Process Explorer per osservare l'attività di memoria/cpu/disco mentre veniva eseguita ciascuna riga.

Esplora processi: http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx.

ZDE include un profiler delle prestazioni di base in grado di mostrare il tempo trascorso in ciascuna chiamata di funzione durante le richieste di pagina.

Io uso una combinazione di Parametro di riferimento della PERA E log4php.

Nella parte superiore degli script che voglio profilare creo un oggetto che avvolge a Benchmark_Timer oggetto.In tutto il codice aggiungo $object->setMarker("name");chiamate, in particolare relative a codici sospetti.

La classe wrapper ha un metodo destroy che prende le informazioni di registrazione e le scrive su log4php.In genere lo invio a syslog (molti server, aggregati in un file di registro su un server).

Durante il debug, posso guardare i file di registro e vedere dove devo migliorare le cose.Più avanti nella produzione, posso analizzare i file di registro ed eseguire analisi delle prestazioni.

Non è xdebug, ma è sempre attivo e mi dà la possibilità di confrontare due esecuzioni qualsiasi del codice.

Puoi anche guardare il Proxy HA o qualsiasi altra soluzione di bilanciamento del carico se le prestazioni ridotte del server sono la causa dell'elaborazione lenta dell'applicazione.server.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top