Ricerca…


Creazione di profili con XHProf

XHProf è un profiler PHP originariamente scritto da Facebook, per fornire un'alternativa più leggera a XDebug.

Dopo aver installato il modulo PHP xhprof , la profilazione può essere abilitata / disabilitata dal codice PHP:

xhprof_enable();
doSlowOperation();
$profile_data = xhprof_disable();

L'array restituito conterrà i dati sul numero di chiamate, il tempo della CPU e l'utilizzo della memoria di ciascuna funzione a cui è stato effettuato l'accesso all'interno di doSlowOperation() .

xhprof_sample_enable() / xhprof_sample_disable() può essere usato come opzione più leggera che registra le informazioni di profilazione solo per una frazione di richieste (e in un formato diverso).

XHProf ha alcune funzioni di supporto (per lo più non documentate) per visualizzare i dati ( vedi esempio ), oppure puoi usare altri strumenti per visualizzarli (il blog platform.sh ne ha un esempio ).

Utilizzo della memoria

Il limite di memoria di runtime di PHP viene impostato tramite la direttiva INI memory_limit . Questa impostazione impedisce a qualsiasi singola esecuzione di PHP di utilizzare troppa memoria, estenuandola per altri script e software di sistema. Il limite di memoria predefinito è 128M e può essere modificato nel file php.ini o in fase di esecuzione. Può essere impostato per non avere limiti, ma generalmente è considerato una cattiva pratica.

L'utilizzo esatto della memoria utilizzato durante il runtime può essere determinato chiamando memory_get_usage() . Restituisce il numero di byte di memoria allocati allo script attualmente in esecuzione. A partire da PHP 5.2, ha un parametro booleano opzionale per ottenere la memoria del sistema allocata totale, al contrario della memoria che viene utilizzata attivamente da PHP.

 <?php
 echo memory_get_usage() . "\n";
 // Outputs 350688 (or similar, depending on system and PHP version)

 // Let's use up some RAM
 $array = array_fill(0, 1000, 'abc');

 echo memory_get_usage() . "\n";
 // Outputs 387704

 // Remove the array from memory
 unset($array);

 echo memory_get_usage() . "\n";
 // Outputs 350784

Now memory_get_usage ti dà l'utilizzo della memoria nel momento in cui viene eseguito. Tra le chiamate a questa funzione è possibile allocare e deallocare altre cose in memoria. Per ottenere la massima quantità di memoria utilizzata fino a un certo punto, chiama memory_get_peak_usage() .

<?php
echo memory_get_peak_usage() . "\n";
// 385688
$array = array_fill(0, 1000, 'abc');
echo memory_get_peak_usage() . "\n";
// 422736
unset($array);
echo memory_get_peak_usage() . "\n";
// 422776

Si noti che il valore salirà o rimarrà costante.

Creazione di profili con Xdebug

È disponibile un'estensione per PHP chiamata Xdebug per aiutare a profilare le applicazioni PHP , oltre al debugging in runtime. Quando si esegue il profiler, l'output viene scritto su un file in un formato binario chiamato "cachegrind". Le applicazioni sono disponibili su ogni piattaforma per analizzare questi file.

Per abilitare la profilazione, installa l'estensione e regola le impostazioni di php.ini. Nel nostro esempio eseguiremo il profilo opzionalmente basato su un parametro di richiesta. Questo ci permette di mantenere le impostazioni statiche e accendere il profiler solo se necessario.

// Set to 1 to turn it on for every request
xdebug.profiler_enable = 0
// Let's use a GET/POST parameter to turn on the profiler
xdebug.profiler_enable_trigger = 1
// The GET/POST value we will pass; empty for any value
xdebug.profiler_enable_trigger_value = ""
// Output cachegrind files to /tmp so our system cleans them up later
xdebug.profiler_output_dir = "/tmp"
xdebug.profiler_output_name = "cachegrind.out.%p"

Quindi utilizzare un client Web per fare una richiesta all'URL della propria applicazione che si desidera profilare, ad es

http://example.com/article/1?XDEBUG_PROFILE=1

Mentre la pagina viene elaborata, scriverà su un file con un nome simile a

/tmp/cachegrind.out.12345

Si noti che scriverà un file per ogni richiesta / processo PHP che viene eseguita. Ad esempio, se si desidera analizzare un post di un modulo, verrà scritto un profilo per la richiesta GET per visualizzare il modulo HTML. Il parametro XDEBUG_PROFILE dovrà essere passato alla successiva richiesta POST per analizzare la seconda richiesta che elabora il modulo. Pertanto, quando si profila il profilo, a volte è più semplice eseguire curl su POST di un modulo direttamente.

Una volta scritta, la cache del profilo può essere letta da un'applicazione come KCachegrind.

KCachegrind

Ciò visualizzerà le informazioni che includono:

  • Funzioni eseguite
  • Chiamare il tempo, sia esso stesso che le chiamate di funzione successive
  • Numero di volte in cui ogni funzione è chiamata
  • Call graphs
  • Link al codice sorgente

Ovviamente l'ottimizzazione delle prestazioni è molto specifica per i casi d'uso di ciascuna applicazione. In generale è bene cercare:

  • Chiamate ripetute alla stessa funzione che non ti aspetteresti di vedere. Per le funzioni che elaborano e interrogano i dati, queste potrebbero essere le migliori opportunità per la cache dell'applicazione.
  • Funzioni a bassa velocità. Dove è l'applicazione che passa la maggior parte del suo tempo? il miglior risultato nell'ottimizzazione delle prestazioni si concentra su quelle parti dell'applicazione che consumano più tempo.

Nota : Xdebug, e in particolare le sue funzionalità di creazione di profili, richiedono molte risorse e rallentano l'esecuzione di PHP. Si consiglia di non eseguirli in un ambiente server di produzione.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow