Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Introduzione a XDebug: debugger per PHP

Controlliamo il codice dei nostri script con XDebug, l'estensione per PHP che esegue debugging, profiling e tracing delle nostre creazioni
Controlliamo il codice dei nostri script con XDebug, l'estensione per PHP che esegue debugging, profiling e tracing delle nostre creazioni
Link copiato negli appunti

Probabilmente questa è l'affermazione più ricorrente con cui introduco i miei articoli, ma non mi dispiace ripetermi in questo caso: il mondo dello sviluppo web sta cambiando e fortunatamente PHP sta iniziando a prendere il passo degli altri colossi per aprirsi strada verso il mondo enterprise. Questo vuol dire permettere a molti sviluppatori di utilizzare il linguaggio in ambienti che fino a qualche tempo fa erano improponibili per restrizioni societarie, ma vuol dire anche fornire agli sviluppatori una serie di strumenti di alto livello per poter monitorare progetti di grosse dimensioni. Oltre ad alcuni interessanti strumenti a pagamento la Zend ha rilasciato un Framework open source di cui abbiamo avuto modo di parlare in alcuni articoli l'anno scorso; purtroppo non ha ancora rilasciato molti strumenti per il controllo del codice scritto (salvo quelli integrati in Zend Studio) ma fortunatamente la comunità ci è venuta incontro con uno strumento molto interessante: XDebug.

Di XDebug si è accennato spesso in questa sede oppure sul blog di html.it, ma non abbiamo mai approfondito il discorso. Data la situazione attuale ed il buono stato di questo progetto (che ora è molto stabile, documentato in modo dignitoso e ricco di funzionalità) ho ritenuto interessante preparare una serie di interventi sull'argomento, sperando di riuscirvi a trasmettere alcune conoscenze che vi permettano di iniziare ad utilizzare XDebug per i vostri progetti.

Cos'è XDebug ed a cosa serve ?

XDebug è un'estensione nativa per PHP che aggiunge molte funzionalità di debugging, tracing e profiling ai nostri script. Detto questo, e presupponendo che alcuni di voi non siano abituati ad utilizzare strumenti di analisi e controllo del codice di questo tipo (soprattutto le persone che provengono dallo sviluppo web che purtroppo è spesso carente da questo punto di vista), vediamo di spiegare un po' più in dettaglio cosa si intende per debugging, tracing e profiling.

Con debugging si intendono tutte quelle operazioni che permettono di analizzare passo passo l'esecuzione del codice, ottenendo informazioni sullo stato corrente dello strumento che sta eseguendo il nostro script. Quando effettuiamo un debugging possiamo istruire l'interprete in modo che metta in pausa l'esecuzione a determinate righe di codice (o in caso in cui si verifichino condizioni particolari) in modo da permetterci di analizzare lo stato del programma in quel preciso instante. Possiamo ispezionare i valori delle variabili, i valori restituiti dall'esecuzione di determinate espressioni, controllare lo stack di chiamate a funzioni e molto altro in modo da avere un controllo completo. Possiamo inoltre eseguire il codice riga per riga in modo da sapere dettagliatamente cosa avviene.

Il tracing è un'operazione che permette di analizzare a tracciare l'esecuzione del codice: possiamo ottenere informazioni sulla profondità delle chiamate (anche ricorsive) sul tempo di esecuzione per ogni singola chiamata o globale oppure ottenere altre statistiche dettagliate in base alle esigenze.

Infine il profiling è un'operazione simile al tracing, ma che come scopo non ha quello di tracciare l'esecuzione del codice, bensì immagazzinare molti dati relativi alle performance durante l'esecuzione del codice. Questi dati sono relativi alla memoria utilizzata, il tempo di esecuzione, il numero di chiamate e molto altro. I dati generati dalle operazioni di profiling sono spesso utilizzati da programmi statistici che generano dei report leggibili che ci permettono di comprendere quali sono i colli di bottiglia nel nostro codice. Il profiling è molto utile se utilizzato insieme alla buona norma di evitare l'ottimizzazione precoce: prima scriviamo del codice mantenendo gli accorgimenti minimi che ci permettono di ottenere dei discreti risultati in breve tempo; successivamente quando il lavoro è considerabile ultimato, si passa all'analisi con il profiler per ottimizzare le procedure più lente o che consumano più risorse. Spesso difatti ci sono funzionalità che vengono utilizzate pochissimo e che non ha molto senso ottimizzare, mentre magari ci sono funzioni basilari utilizzate migliaia di volte che è estremamente importante riuscire a ripulire e rifinire per ottenere buoni risultati.

Spesso questi strumenti sono utilizzati per capire dove si trovano malfunzionamenti nel codice, pratica che in PHP spesso comporta l'abuso delle funzioni di output e di logging. Utilizzando questi strumenti i risultati sono molto più precisi ed enormemente più semplici da organizzare ed utilizzare.

Installazione di XDebug

L'installazione di XDebug per PHP è un processo molto semplice dato che si esegue con le operazioni più o meno standard che vanno effettuate ogni qualvolta si desideri installare un'estensione per PHP. XDebug viene anche fornito con un client di debugging grafico che gira su ambiente Linux e Windows, che è liberamente scaricabile e permette di evitare l'utilizzo di XDebug da linea di comando, che per qualcuno potrebbe risultare poco ortodosso oppure semplicemente poco comodo.

Tornando all'installazione dell'estensione possiamo procedere in diversi modi che elencherò in seguito. In generale è bene ricordare che XDebug non convive felicemente con altre estensioni per lo Zend Engine come APC o Zend Optimizer, quindi è bene disabilitarle temporaneamente quando si vuole effettuare il debugging. In futuro molto probabilmente queste incompatibilità verranno risolte.

Modulo precompilato

Possiamo scaricare la DLL precompilata per dal sito internet di XDebug per la versione di PHP che attualmente abbiamo installato; dopo averla scaricata e posizionata all'interno di una cartella a scelta (preferibilmente quella in cui tenete tutti i moduli di PHP), aggiungiamo la seguente riga al file php.ini, ricordandoci si modificare in modo adeguato il path che punta al modulo:

zend_extension_ts="c:/php/modules/php_xdebug-4.4.1-2.0.2.dll"

Successivamente riavviate Apache e controllate l'output della funzione phpinfo() per assicurarci che il modulo sia stato caricato in modo adeguato.

Installazione dai sorgenti

L'installazione partendo dai sorgenti è operazione molto comune su ambienti Unix, molto meno su Windows. In questa sezione descriverò solamente la compilazione di Linux.

I sorgenti possono essere scaricati dal sito oppure dal repository CVS online, accessibile attraverso un utente con i permessi di lettura:

cvs -d :pserver:srmread@cvs.xdebug.org:/repository login
CVS password: srmread
cvs -d :pserver:srmread@cvs.xdebug.org:/repository co xdebug

Una volta fatto il checkout dell'ultima versione possiamo procedere con la compilazione, che va svolta in modo separato da PHP ma necessita comunque dell'accesso agli script phpize e php-config. Accediamo alla cartella nella quale abbiamo fatto il checkout dei sorgenti ed eseguiamo il comando phpize seguito dal comando di configurazione:

./phpize
./configure --enable-xdebug --with-php-config=/path/to/php-config

Se tutto procede come previsto possiamo eseguire make e successivamente copiare il file xdebug.so generato dalla compilazione nella cartella dei moduli di PHP. Nel caso invece la configurazione restituisca degli errori, ricordatevi di controllare se le versioni di autotools sono aggiornate e se la versione di PHP installata corrisponde con quella che state compilando. Infine aggiungete al file php.ini la seguente riga, aggiornando di conseguenza il path:

zend_extension="/var/php/modules/xdebug.so"

Dopo il riavvio di apache potrete controllare dall'output della funzione phpinfo() se l'installazione è andata per il verso giusto.

Installazione usando PECL

L'ultimo processo di installazione prevede l'utilizzo di PECL per installare il modulo. PECL, brevemente per chi non lo sapesse, è un repository per estensioni native PHP. Attraverso il comando pecl (che viene normalmente installato quando si installa PHP) è possibile installare questi moduli dal repository, lasciando che sia il sistema stesso a gestire configurazioni e dipendenze quando possibile.

Per installare XDebug utilizzando PECL il procedimento è molto semplice. In primis effettuiamo l'installazione del package utilizzando il comando pecl:

pecl install xdebug

E successivamente modifichiamo il file php.ini inserendo la seguente riga:

zend_extension="/var/php/modules/xdebug.so"

Riavviamo Apache e controlliamo l'output della funzione phpinfo() per vedere se l'installazione del modulo è andata a buon fine.

Conclusione

Nei prossimi articoli ci occuperemo di vedere in dettagli come utilizzare le varie funzionalità esposte dal modulo XDebug, nonché daremo uno sguardo alle opzioni di configurazione che permettono un alto livello di customizzazione del comportamento della libreria.

Ti consigliamo anche