Xdebug - Debugging professionale di PHP

La nostra agenda

  1. Introduzione all'argomento.
  2. Download e installazione di Xdebug sul computer locale (Mac OS X 10.6.6+, MAMP 2.1.1).
  3. Integrazione con PhpStorm.
  4. Esercita il debugging.

Di cosa avrai bisogno

  • Un Mac con Mac OS X 10.6.6+.
    • Se sei su 10.8.X tu potrebbe è necessario installare XQuartz come Apple ha rimosso X11.
    • Se sei su Windows, l'intero processo è un po 'più semplice, basta premere su Google per ulteriori dettagli.
  • Apple Xcode 4.6 (gratuito sul Mac App Store).
    • Strumenti da riga di comando.
  • homebrew.
  • Un'app terminale di tua scelta.
  • PhpStorm 5+ (anche molti altri IDE funzioneranno).

Cos'è Xdebug?

Bene, tecnicamente, Xdebug è un'estensione per PHP per semplificarti la vita mentre esegui il debug del tuo codice. Al momento, potresti essere usato per eseguire il debug del tuo codice con varie altre semplici soluzioni. Questi includono l'utilizzo eco istruzioni in diversi stati all'interno del tuo programma per scoprire se la tua applicazione passa una condizione o per ottenere il valore di una certa variabile. Inoltre, potresti usare spesso funzioni come var_dump, print_r o altri per ispezionare oggetti e array.

Quello che mi capita spesso di incontrare sono piccole funzioni di aiuto, come questo ad esempio:

function dump ($ value) echo '
'; var_dump ($ value); eco '
';

La verità è che anche io lo facevo da molto tempo.

La verità è che anche io lo facevo da molto tempo. Quindi cosa c'è di sbagliato in questo? Tecnicamente, non c'è niente di sbagliato in questo. Funziona e fa ciò che dovrebbe fare.

Ma immagina per un momento, mentre le tue applicazioni evolvono, potresti prendere l'abitudine di cospargere il tuo codice dappertutto con echi, var_dump e debugger personalizzati. Ora concesso, questo non è ostruttivo durante il tuo flusso di lavoro di test, ma cosa succede se ti dimentichi di pulire un po 'di quel codice di debug prima di andare in produzione? Ciò può causare alcuni problemi piuttosto spaventosi, in quanto quei piccoli debugger possono persino trovare la loro strada nel controllo della versione e rimanere lì per molto tempo.

La prossima domanda è: come si fa il debug in produzione? Di nuovo, immagina di navigare su uno dei tuoi servizi web preferiti e all'improvviso ti viene mostrato un grande dump di informazioni di debug sullo schermo. Ora ovviamente potrebbe sparire dopo il prossimo aggiornamento del browser, ma non è una buona esperienza per l'utente del sito.

Finalmente, hai mai desiderato essere in grado di scorrere il tuo codice, riga per riga, guardare le espressioni e persino entrare in una chiamata di funzione per vedere perché produce un valore di ritorno errato?

Bene, dovresti sicuramente scavare nel mondo del debug professionale Xdebug, come può risolvere tutti i problemi di cui sopra.


Configurazione di MAMP

Non voglio andare troppo in profondità nel processo di download e installazione di MAMP su un Mac. Invece, condividerò con te che sto usando PHP 5.4.4 e la porta standard Apache (80) in questa lettura.


La tua prima decisione

Una breve nota prima di iniziare a costruire il nostro Xdebug tramite Homebrew: se vuoi prendere il percorso più semplice, MAMP è già dotato di Xdebug 2.2.0. Per abilitarlo, apri:

/Applications/MAMP/bin/php/php5.4.4/conf/php.ini

con un editor di testo a tua scelta, vai in fondo e decommenta l'ultima riga rimuovendo il ;.

Le ultime due righe del file dovrebbero essere così:

[xdebug] zend_extension = "/ Applicazioni / MAMP / bin / php / php5.4.4 / lib / php / extensions / no-debug-non-zts-20100525 / xdebug.so"

Ora se ti stai chiedendo:

"Perché dovrei scegliere un modo più duro di questo?"

E la mia risposta è che non è mai un errore guardare oltre il tuo bordo e imparare qualcosa di nuovo. Soprattutto come sviluppatore in questi giorni, lanciare un occhio su roba relativa al server sarà sempre utile ad un certo punto nel tempo. Promessa.


Installa Xcode e gli strumenti della riga di comando

Puoi scaricare Apple Xcode gratuitamente dal Mac App Store. Una volta scaricato, vai alle preferenze dell'applicazione, premi il tasto "Downloads" scheda e installare il "Strumenti della riga di comando" dalla lista.


Installa Homebrew

Homebrew è un piccolo e accurato gestore di pacchetti per Mac OS X che ti offre tutto ciò che Apple ha lasciato fuori. Per installare Homebrew, basta incollare il seguente comando nel tuo terminale.

ruby -e "$ (curl -fsSkL raw.github.com/mxcl/homebrew/go)"

Su un Mac, Homebrew sarà il modo più conveniente per installare Xdebug. Su Linux, tuttavia, compilarlo tu stesso è il modo migliore per andare; che non è così facile su un Mac.

Suggerimento: gli utenti di Windows devono solo scaricare il * .dll file da Xdebug.org, metterlo nella cartella XAMPP e aggiungere il percorso al loro php.ini file.

Come sviluppatore PHP, dovresti essere a conoscenza del repository Github di Jose Gonzalez "homebrew-php", che contiene un sacco di utili "brews" per te. Se ti sei mai chiesto come installare PHP 5.4 manualmente, sei proprio lì.

Ora, se hai problemi durante l'installazione di Homebrew, controlla il file Leggimi di Jose.

Per completare la nostra escursione Homebrew, vogliamo "toccare" le formule di produzione di Jose eseguendo i seguenti comandi all'interno dell'applicazione terminale:

brew rubinetto homebrew / dupes

Questo ci porterà alcune dipendenze di cui abbiamo bisogno per le formule di Jose.

brew tap josegonzalez / homebrew-php

Fatto! Ora dovremmo essere pronti per installare Xdebug in modo comodo, su un Mac.


Installa Xdebug

Torna nella tua applicazione terminale, per favore esegui:

brew install php54-xdebug

Se sei su PHP 5.3, sostituisci il "4" con un "3";)

L'installazione richiederà del tempo. Dopo averlo fatto, vedrai un'icona della birra e alcune ulteriori istruzioni che puoi ignorare.

Quindi cos'è successo? Homebrew ha scaricato tutti i file incluse le loro dipendenze e li ha creati per te. Come ti ho già detto, compilare te stesso su un Mac può essere una seccatura. Alla fine, abbiamo ricevuto una nuova compilazione xdebug.so situato in /usr/local/Cellar/php54-xdebug/2.2.1/.

Attenzione: si prega di notare che Homebrew installerà PHP 5.4 sul proprio sistema durante il processo. Questo non dovrebbe influenzare nulla in quanto non è abilitato sul tuo sistema.

Per installare finalmente Xdebug, abbiamo solo bisogno di seguire alcuni altri passaggi.

Cambia directory (CD) alla cartella delle estensioni di MAMP:

cd /Applications/MAMP/bin/php/php5.4.4/lib/php/extensions/no-debug-non-zts-20100525

Puoi ricontrollare il percorso guardando l'ultima riga di /Applications/MAMP/bin/php/php5.4.4/conf/php.ini, come questo è dove stiamo andando.

Backup dell'esistente xdebug.so nel caso in cui:

mv xdebug.so xdebug.so.bak

Quindi copia il tuo build Homebrew Xdebug:

cp /usr/local/Cellar/php54-xdebug/2.2.1/xdebug.so /Applications/MAMP/bin/php/php5.4.4/lib/php/extensions/no-debug-non-zts-20100525/

Se vuoi forzare una copia (cp) comando per sovrascrivere i file esistenti, basta fare obiettivo sorgente cp -X.

Ultimo, ma non meno importante, abbiamo bisogno di modificare il php.ini file per caricare il file di estensione Xdebug. Aperto /Applications/MAMP/bin/php/php5.4.4/conf/php.ini con un editor di testo a tua scelta, vai in fondo e decommenta l'ultima riga rimuovendo il punto e virgola in primo piano. Non chiudere il file ancora.

Ora riavvia MAMP, vai su http: //localhost/MAMP/phpinfo.php. Se tutto è andato bene, dovresti trovarlo all'interno dell'output:


Se lo ha fatto non lavoro, assicurati di aver copiato davvero il file xdebug.so e avere la strada giusta nella tua php.ini file.


Inizia il debug

Prima di iniziare effettivamente il debug, dobbiamo abilitare Xdebug. Pertanto, spero che tu non abbia chiuso la tua php.ini, come abbiamo bisogno di aggiungere questa linea fino alla fine, dopo il zend_extension opzione:

xdebug.remote_enable = On

Salva e chiudi il tuo php.ini file e riavviare MAMP. Vai a http: //localhost/MAMP/phpinfo.php ancora e cerca xdebug.remote sul posto. I tuoi valori dovrebbero apparire esattamente come i miei:


Se non lo fanno, segui la stessa procedura che hai usato per aggiungere remote_enable = On per le altre dichiarazioni alla fine del tuo php.ini file.

Ora apri il tuo IDE preferito. Puoi usare Xdebug con una serie di popolari soluzioni software come Eclipse, Netbeans, PhpStorm e anche Sublime Text. Come ho detto prima, userò PhpStorm EAP 6 per questa demo.

All'interno di PhpStorm, apri le preferenze dell'applicazione e trova la tua strada verso "PHP \ Debug \ DBGp Proxy" sul lato sinistro, come nello screenshot qui sotto:


Ora scegli la tua chiave IDE personale. Questa può essere una stringa alfanumerica che desideri. Preferisco semplicemente chiamarlo PhpStorm, ma XDEBUG_IDE o il mio nome andrebbe benissimo anche lui. È importante impostare il "Porta" valore a 9000 come la nostra configurazione standard di Xdebug usa questa porta per connettersi all'IDE.

Suggerimento: se è necessario regolarlo, aggiungere xdebug.remote_port = numero porta alla tua php.ini file.

Attenzione: altri componenti potrebbero cambiare questo valore all'interno di PhpStorm, quindi fai attenzione se qualcosa non funziona.

Successivamente, fai clic sul pulsante del piccolo telefono rosso con un piccolo bug accanto alla barra degli strumenti in alto. Dovrebbe diventare verde. In questo modo PhpStorm ascolta tutte le connessioni Xdebug in arrivo.


Ora dobbiamo creare qualcosa per il debug. Crea un nuovo file PHP, chiamalo come preferisci e incolla il seguente codice:

 

Ora questo codice è falso per impostazione predefinita, ma lo risolveremo in un momento, nella prossima sezione.

Assicurati che tutto sia salvato e apri il browser per lo script appena creato. Userò Google Chrome per questa demo, ma qualsiasi browser lo farà.

Ora prendiamo un momento per capire come viene inizializzato il processo di debug. Il nostro stato attuale è: Xdebug abilitato come estensione Zend, in ascolto porta 9000 per un cookie che appare durante una richiesta. Questo cookie avrà una chiave IDE che dovrebbe essere uguale a quella che abbiamo configurato all'interno del nostro IDE. Come Xdebug vede il cookie che trasporta la richiesta, proverà a connettersi a un proxy, il nostro IDE.

Quindi, come facciamo a mettere quel biscotto sul posto? PHP di setcookie? No. Sebbene ci siano molti modi, anche alcuni per farlo funzionare senza cookie, utilizzeremo una piccola estensione per browser come aiuto.

Installa "Xdebug helper" "sul tuo browser Google Chrome o cerca l'estensione che lo farà per il browser che stai utilizzando.

Una volta installata l'estensione, fai clic con il tasto destro del mouse sul piccolo bug che appare nella barra degli indirizzi e vai alle opzioni. Configura il valore per la chiave IDE in modo che corrisponda alla chiave che hai scelto nel tuo IDE, in questo modo:


Dopo averlo configurato, fai clic sul bug e seleziona "Debug" dalla lista. Il bug dovrebbe diventare verde:


Ora, torna a PhpStorm o al tuo IDE preferito e imposta un "punto di interruzione". I punti di interruzione sono come marcatori su una linea che indicano al debugger di interrompere l'esecuzione dello script in quel punto di interruzione.

In PhpStorm, puoi semplicemente aggiungere punti di interruzione facendo clic sullo spazio accanto ai numeri di linea sul lato sinistro:


Basta provare a fare clic su dove appare il punto rosso sullo screenshot. Avrai quindi un punto di interruzione su cui il tuo script dovrebbe fermarsi.

Nota: puoi avere più punti di interruzione in tutti i file che desideri.

Ora siamo tutti pronti. Torna al tuo browser, assicurati che il bug sia verde e ricarica la pagina per inviare il cookie alla richiesta successiva.

Suggerimento: se si imposta un cookie, sarà disponibile per la richiesta successiva.

Se tutto procede secondo i piani, questa finestra dovrebbe apparire all'interno di PhpStorm per informarti di una connessione debug in entrata:


La finestra non è stata visualizzata per te? Facciamo un po 'di risoluzione dei problemi e ripetiamo ciò che deve essere impostato affinché questo abbia successo:

  1. Dovresti trovare informazioni su Xdebug all'interno di phpinfo ()l'output. In caso contrario, ottenere il xdebug.so file nel posto giusto e imposta il tuo php.ini file.
  2. Imposta le impostazioni di PhpStorm DBGp sulla tua chiave IDE, ad es. "PHPSTORM" e porta "9000".
  3. Fai in modo che PhpStorm ascolti le connessioni di debug in entrata usando l'icona del telefono rosso che diventerà verde.
  4. Impostare un punto di interruzione nel codice o selezionare "Esegui \ Break alla prima riga negli script PHP" essere indipendente da qualsiasi punto di interruzione. Si noti che questo non è adatto per l'uso pratico.
  5. Ottieni un'estensione del browser per impostare il cookie Xdebug.
  6. Assicurati che l'estensione del browser abbia la stessa chiave IDE che hai scelto all'interno del tuo IDE.
  7. Ricarica la pagina e PhpStorm dovrebbe ottenere la connessione.

Se ottieni la finestra di dialogo visualizzata nell'immagine precedente, ti preghiamo di accettarla. Questo ti porterà in modalità di debug, in questo modo:


È possibile vedere che il debugger ha interrotto l'esecuzione dello script nel punto di interruzione, evidenziando la linea in blu. PHP ora è in attesa e controllato da Xdebug, che da ora in poi sarà guidato dalle tue stesse mani.

Il nostro spazio di lavoro principale sarà la sezione inferiore dell'IDE che sta già mostrando alcune informazioni sullo script in esecuzione (i superglobali).


E lo guarderesti? C'è il cookie che abbiamo appena impostato per avviare la sessione di debug. Ora puoi fare clic sui superglobali e controllare i loro valori in questo preciso momento. PHP è in attesa, non ci sono limiti di tempo, almeno non i 30 secondi predefiniti.

Sul lato sinistro, vedrai alcuni pulsanti. Per ora, solo "Giocare" e "Stop" ci interessano Il pulsante di riproduzione verde riprenderà lo script. Se c'è un altro punto di interruzione nel codice, lo script continuerà fino a raggiungere il punto di interruzione e si fermerà di nuovo.

Il pulsante rosso di stop interrompe lo script. Proprio come PHP Uscita o morire farebbe.


Ora quelli veramente interessanti arrivano nella parte superiore della finestra di debug:


Controlliamoli rapidamente:

  1. Scavalcare: Questo significa fare un passo avanti.
  2. Entra: Se la linea blu evidenzia, ad esempio, una chiamata di funzione, questo pulsante ti consente di esaminare le informazioni della funzione.
  3. Uscire: Se entri in una funzione e vuoi uscire prima che venga raggiunta la fine, esci semplicemente.
  4. Corri al cursore: Diciamo che, ad esempio, il file è lungo 100 righe e il punto di interruzione è stato impostato alla seconda riga per ispezionare qualcosa. Ora vuoi correre velocemente fino al punto in cui hai fatto semplicemente clic sul tuo cursore: questo pulsante è per te. Puoi cliccare "Scavalcare" n volte anche;)

Ora non preoccuparti, dato che usi Xdebug ti adatterai rapidamente alle scorciatoie sulla tastiera.


Effettivamente il debug di alcuni esempi di codice

Ti ho già detto che il codice che hai copiato / incollato è falso, quindi dovrai eseguire il debug. Inizia a scavalcare il codice, dichiarazione per dichiarazione.

Si noti che la linea blu si arresta solo sulle linee che contengono effettivamente un comando. Spazio bianco e commenti saranno saltati.

Una volta raggiunta la chiamata della funzione a caricare dati, per favore non calpestare, basta oltrepassare e fermare il Se dichiarazione.


Puoi vedere due nuove variabili nel "Variabili" pannello nella parte inferiore dello schermo. Ora, perché ha fatto il $ data ritorno variabile falso? Sembra che la sceneggiatura avrebbe dovuto fare il suo lavoro. Diamo un'occhiata. Torna alla riga sette per entrare nella chiamata alla funzione -> bam! Riceviamo un messaggio che ci informa che non possiamo "fare un passo indietro". Per portare nuovamente il tuo debugger sulla linea sette, devi interrompere questa sessione e ricaricare la pagina nel browser. Fatelo e entrate questa volta nella chiamata di funzione.

Fermati sul ritorno affermazione all'interno del caricare dati funzione e vedere cosa è successo:


Il $ phpData la matrice è vuota. Il ritorno dichiarazione utilizza un operatore ternario per rilevare cosa restituire. E ritornerà falso per un array vuoto.

Correggere la linea per dire:

ritorna $ phpData;

Come json_decode restituirà i dati o nullo in caso di fallimento. Ora interrompi la sessione di debug, ricarica il browser e supera la chiamata di funzione questa volta.


Ora sembra che abbiamo ancora un problema mentre entriamo nella condizione. Si prega di risolvere la condizione da utilizzare è zero() per rilevare cosa sta succedendo:

if (is_null ($ data)) die ('Impossibile caricare i dati'); 

Ora tocca a te provare a fare un passo indietro. Suggerirei di ripristinare lo script nella versione falsa originale, eseguendo il debug con ecoe quindi confrontare come ci si sente rispetto all'utilizzo di Xdebug.


Conclusione

In questo articolo dovresti aver acquisito molte nuove conoscenze. Non esitare a leggerlo di nuovo e ad aiutare un amico a configurare Xdebug - niente di meglio!

Potresti provare a sostituire il solito comportamento di debug usando invece Xdebug. Soprattutto con progetti più grandi orientati agli oggetti, poiché diventano molto più facili da eseguire il debug e persino recuperare il flusso, se non si ottiene subito qualcosa.

Nota che questa è solo la punta dell'iceberg. Xdebug offre molto più potere che deve essere esplorato pure.

Non esitate a fare domande nei commenti e fatemi sapere cosa ne pensate.