Guida all’uso di XHProf. Installazione, configurazione e utilizzo per velocizzare un sito web.
XHProf è un’estensione dell’interprete PHP che permette di analizzare l’esecuzione di una pagina web, collezionando dati relativi all’utilizzo di CPU, memoria e tempo di esecuzione. Questo profiler consente inoltre di generare un diagramma visuale, semplificando le operazioni di debugging e permettendo di identificare in maniera semplice quali sono le parti del codice che rallentano la visualizzazione del sito.
Installazione
Per integrare la libreria xhprof.so in PHP è necessario operare con i privilegi di amministratore, utilizzando una connessione SSH.
Nel nostro caso, utilizzeremo un sistema Debian GNU/Linux con PHP in modalità FastCGI ed apache2, quindi il packet manager APT e l’installer PECL.
Tutti i software necessari all’utilizzo del profiler possono essere installati con questo comando:
apt-get install php5-common php5-dev make graphviz php-pear
Mentre per scaricare e compilare automaticamente xhprof basterà eseguire queste istruzioni:
pecl config-set preferred_state beta pecl install xhprof
Configurazione
Inizialmente occorre creare la directory in cui memorizzare i file generati da xhprof, impostando su di essa il corretto proprietario, ovvero l’utente relativo al sito da analizzare:
mkdir /tmp/xhprof/ chown utente_sito /tmp/xhprof/
Abilitiamo quindi l’estensione in PHP, creando il file /etc/php5/conf.d/xhprof.ini e memorizzando al suo interno le seguenti direttive:
[xhprof] extension=xhprof.so xhprof.output_dir="/tmp/xhprof"
Per poter consultare il grafico generato in formato HTML e direttamente da un browser web, basterà creare questo alias nella configurazione di apache2 e più precisamente nel file /etc/apache2/conf.d/xhprof.conf
alias /xhprof_html "/usr/share/php/xhprof_html/"
Riavviando il web server ed eseguendo il comando
php -m
sarà possibile verificare che il modulo viene caricato dal PHP
Non rimane che creare questi due file nella document root del sito
autoprepend.php: <?php if (extension_loaded('xhprof')) { include_once '/usr/share/php/xhprof_lib/utils/xhprof_lib.php'; include_once '/usr/share/php/xhprof_lib/utils/xhprof_runs.php'; xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY); }
autoappend.php: <?php if (extension_loaded('xhprof')) { $profiler_namespace = "turner"; $xhprof_data = xhprof_disable(); $xhprof_runs = new XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, $profiler_namespace); $profiler_url = sprintf('http://xhprof.seeweb.it/xhprof_html/index.php?run=%s&source=%s', $run_id, $profiler_namespace); printf('<br><br> <a href="%s" target="_blank">Profiler output</a><br>', $profiler_url); } else { echo "<!-- profiler not enabled -->"; } N.B. E' necessario modificare il nome del sito nella funzione "sprintf", inserendo quello del vostro dominio
ed utilizzare le direttive “auto_prepend” e “auto_append” del PHP per abilitare l’analisi di tutte le pagine php del sito.
Quest’ultima operazione può essere eseguita editando manualmente la configurazione del PHP:
auto_prepend_file = /var/www/vhosts/xhprof.seeweb.it/autoprepend.php auto_append_file = /var/www/vhosts/xhprof.seeweb.it/autoappend.php
oppure utilizzando gli strumenti presenti nel pannello amministrativo Plesk che mettiamo a disposizione con il prodotto Cloud Server.
N.B. In base alla configurazione del PHP, potrebbe essere necessario disabilitare la direttiva open_basedir, impostando il suo valore a “none”
Utilizzo
Accedendo al sito con un browser web, avremo modo di verificare la presenza di un nuovo link in fondo alla pagina:
Quel collegamento ci consentirà di visualizzare i dati campionati da XHProf.
Le informazioni mostrano che il sito, su cui è installato il CMS WordPress, viene processato in 306ms e che utilizza 18Mb di memoria
Simuliamo ora un rallentamento dovuto ad un plugin poco ottimizzato, oppure che abbia errori logici.
Tali problemi, generalmente si evidenziano solo dopo che le entry nel vostro database abbiano raggiunto un numero elevato, oppure quando il sito inizia ad avere un traffico cospicuo.
La causa di ciò, solitamente è dovuta a query MySQL di tipo join su tabelle non indicizzate, query che necessitano della creazione di tabelle temporanee su disco, all’utilizzo di risorse esterne (come informazioni derivate dai social media), oppure ad operazioni eseguite ogni qualvolta un utente accede al sito (utilizzando plugin di polling, estensioni che elaborano dati sui visitatori, ecc.)
Nel nostro caso, per simulare un rallentamento, aggiungeremo la funzione “sleep()” nel codice di un plugin.
Ricaricando il sito ed accedendo ai dati di XHProf, noteremo immediatamente che il tempo di esecuzione della pagina è aumentato, rendendo necessaria un’attesa di oltre 5 secondi affinchè il sito venga visualizzato.
Analizzando le informazioni presenti nella tabella, avremo modo di identificare il plugin responsabile e la funzione che deve essere revisionata
Cliccando sul link “View Full Callgraph” infine, mostreremo graficamente e sotto forma di un diagramma, il flusso di esecuzione della pagina web
Articoli correlati:
- Velocizzare WordPress: Caching Plugins & APC
- Velocizzare WordPress con Seeweb
- Errore 500 su un sito WordPress: best pratice per l’immediata risoluzione
- Sicurezza WordPress: come proteggere il proprio sito con i plugin
- Speed Test Tool: quanto è veloce il tuo sito web?
- Time to first byte: aumentare la velocità di un sito WordPress
Una risposta