10,739 bytes added
, 21:20, 29 December 2014
Benvenuti nella pagina Wiki di Simone Giustetti.
Lingue: [http://www.giustetti.net/wiki/index.php?title=En/php_debug English] - '''Italiano'''
----
== Introduzione ==
Ogni sviluppatore dedica un discreto ammontare del proprio tempo lavorativo in attività di '''ricerca e correzione di errori''' comunemente chiamate '''debug'''. Penso si possa affermare senza rischio di smentita che finchè esisteranno i programmi per computer esisteranno anche gli errori e saranno perciò necessarie contromisure correttive. Ogni linguaggio di programmazione è corredato da strumenti esterni o interni, più o meno complessi, dedicati alla '''correzione dei bug'''. Sotto tale punto di vista '''PHP''', un linguaggio molto diffuso per lo sviluppo di siti web dinamici, risulta carente se confrontato con strumenti analoghi. Una lacuna che dovrebbe essere colmata nella versione 5.6 del linguaggio con l'introduzione di un '''debugger interno''', uno strumento che consente di seguire il flusso del codice sorgente in esecuzione. Nel seguito del presente articolo verranno invece presentati alcuni strumenti che consentono di eseguire il debug di codice PHP per versioni meno recenti del linguaggio. Strumenti che complementano il debugger interno e risultano comunque molto utili agli sviluppatori che dovessero manutenere codice in produzione.
== Il linguaggio PHP ==
PHP è un linguaggio per la scrittura di '''script''' particolarmente indicato per lo sviluppo di '''siti web dinamici'''. In quest'ultima configurazione PHP è '''eseguito sul server''' ove genera pagine HTML che sono poi inviate al browser. L'utente riceverà le pagine richieste senza avere alcun indizio della presenza di codice PHP sul server.
Sebbene lo sviluppo di siti dinamici sia l'obiettivo primario dichiarato di PHP, il linguaggio può essere utilizzato anche per la produzione di script autonomi in grado di girare su di una macchina indipendente. Detti script possono eseguire compiti ripetitivi, anche complessi, programmandoli attraverso gli appositi servizi messi a disposizione dal sistema operativo. Nel caso descritto PHP non necessita di appoggiarsi ad un web server, un database o altro servizio esterno, ma esclusivamente al suo interprete.
== Sviluppare codice PHP ==
Quale che sia la finalità per cui si fa ricorso a PHP, scrivere codice è un'operazione estremamente semplice che non richiede particolari strumenti o ambienti di sviluppo dedicati, ma solo:
# L''''interprete per il linguaggio'''.
# Un '''editor di testo''' a scelta.
Una volta installati i due prerequisiti riportati sopra è possibile scrivere da subito codice PHP. Per eseguire lo script realizzato sarà sufficiente aprire un terminale e lanciare il comando:
'''php''' ''-f'' <script>
ove <script> è un file di testo che contiene le righe di codice. Il comando dovrà essere lanciato nella directory contenente il file. Eventuali messaggi o errori prodotti dal codice verranno mostrati a video durante l'esecuzione dello script.
== L'analisi sintattica in PHP ==
L'installazione base di PHP include alcuni strumenti utili per ricercare errori nel codice sorgente degli script. PHP consente di eseguire facilmente l''''analisi sintattica''' di qualsiasi script a cui si abbia accesso diretto. Si supponga di voler verificare la sintassi dello script hello_world.php sito nella directory /home/sviluppo/php/ sarà necessario avviare una '''shell''' o '''analogo emulatore di terminale''' e spostarsi in tale directory:
'''cd''' /home/sviluppo/php/
quindi lanciare l'interprete con l'opzione ''-l'' che specifica di eseguire un controllo sintattico sul file:
'''php''' ''-l'' ./hello_world.php
L'interprete renderà:
bash-4.2$ '''php''' ''-l'' hello_world.php
'''No syntax errors detected''' in hello_world.php
nel caso in cui la sintassi dello script sia esente da errori. Altrimenti verrà mostrata a video una segnalazione relativa alla prima incongruenza rilevata durante l'esecuzione del codice:
bash-4.2$ '''php''' ''-l'' hello_world.php
'''PHP Parse error: syntax error''', unexpected 'echo' (T_ECHO), expecting ',' or ';' in hello_world.php '''on line 3'''
'''Errors parsing''' hello_world.php
Tutte le segnalazioni di errore specificano:
* La '''tipologia''' di errore.
* La '''riga''' che ha generato l'errore.
Dopo aver corretto l'errore, rieseguendo il comando verrà reso il successivo problema riscontrato:
bash-4.2$ '''php''' ''-l'' hello_world.php
'''PHP Parse error: syntax error''', unexpected '' <title>PHP Test</title' (T_CONSTANT_ENCAPSED_STRING) in hello_world.php '''on line 4'''
'''Errors parsing''' hello_world.php
La procedura può essere ripetuta ricorsivamente per tutti gli errori rilevati dall'interprete nel corso dei successivi lanci dello script. Una volta eliminati tutti gli errori si otterrà il messaggio "No syntax errors detected", che attesta la correttezza sintattica del codice sorgente.
Di seguito sono riportati tre listati in codice PHP corrispondenti ai lanci eseguiti nelle righe precedenti. Il primo ed il secondo sono evidentemente afflitti da errori di sintassi anche banali. La differenza tra i due consiste nella correzione dell'errore a riga 2 ove è stata aggiunto un carattere ";" a chiudere la riga di codice. Il terzo listato contiene invece il codice corretto.
''hello_world.php - Listato 1'': Contiene numerosi errori banali di sintassi
<?php
echo '<html>'
echo ' <head>';
iechio ' <title>PHP Test</title>';
echo ' </head>";
echo' <body>';
echo ' <nowiki><p>Hello World</p></nowiki>'; ?>
echo '</body>";
echo '</html>';
?>
''hello_world.php - Listato 2'': Il primo errore segnalato dall'interprete è stato corretto.
<?php
echo '<html>';
echo ' <head>';
iechio ' <title>PHP Test</title>';
echo ' </head>";
echo' <body>';
echo ' <nowiki><p>Hello World</p></nowiki>'; ?>
echo '</body>";
echo '</html>';
?>
''hello_world.php - Listato 3'': Script sintatticamente corretto.
<?php
echo "<html>\n";
echo " <head>\n";
echo " <title>PHP Test</title>\n";
echo " </head>\n";
echo " <body>\n";
echo " <nowiki><p>Hello World</p></nowiki>'; ?>
echo " </body>\n";
echo "</html>\n";
?>
== Visualizzare variabili in PHP ==
L'analisi della sintassi è utile come primo strumento per trovare errori, ma si tratta comunque di dimenticanze e sviste in fase di scrittura del codice. Gli errori di sintassi sono relativamente semplici da individuare e correggere. Decisamente più complicati da identificare e correggere sono gli '''errori di logica''' che si presentano durante l'esecuzione del codice. Per individuare tali errori è necessario seguire il flusso del codice, determinare quali file siano eseguiti e con che ordine e infine ottenere un elenco delle variabili ed il loro contenuto. In questo caso PHP offre un insieme decisamente limitato di strumenti: Le '''funzioni di backtrace e dump'''.
Le funzioni di backtrace rendono un '''elenco dei file di codice e delle funzioni richiamati''' durante l'esecuzione dello script principale. Esistono due funzioni di backtrace:
* '''debug_backtrace()'''.
* '''debug_print_backtrace()'''.
La prima rende un array associativo contenente per ogni componente:
* Il file chiamante.
* La riga in cui viene eseguita una chiamata ad altro file o funzione.
* Il file o la funzione chiamati.
* Un array contenente l'elenco dei parametri passati alla funzione chiamata ed i rispettivi valori.
Le chiamate sono elencate in ordine decrescente ciò implica che '''la componente 0 dell'array reso dalla funzione corrisponda all'ultima chiamata eseguita'''. Avanzando tra le componenti si scorreranno le chiamate precedenti fino ad arrivare allo script principale.
debug_print_backtrace rende solo l'elenco delle chiamate o inclusioni di file in ordine decrescente. Ogni riga della lista riporta il nome della funzione o del file chiamati, il file contenente la chiamata e la riga corrispondente. La prima riga resa da debug_print_backtrace corrisponde all'ultima chiamata eseguita; scorrendo le righe seguenti sarà possibile ricostruire il flusso del codice.
Le funzioni di dump messe a disposizione da PHP consentono di ottenere un elenco delle variabili definite al momento della chiamata ed i rispettivi valori. Esistono svariate funzioni di dump predefinite; le principali sono:
* '''get_defined_vars()'''.
* '''print_r()'''.
* '''var_export()'''.
* '''var_dump()'''.
La funzione get_defined_vars rende un elenco di '''tutte''' le variabili definite al momento in cui viene chiamata nel codice. L'elenco è esportato sotto forma di array multi-dimensionale in cui ogni componente corrisponde ad una variabile. Le restanti funzioni accettano un parametro corrispondente alla '''variabile desiderata''' di cui rendono nome e valore con formati leggermente diversi.
== Conclusioni ==
L'aspetto negativo nell'impiegare le funzioni elencate in precedenza consiste nella '''necessità di modificare il codice sorgente'''. Una sessione di debug tramite funzioni consisterà in:
# Individuare il file da cui incominciare ad eseguire l'analisi del codice.
# Inserire funzioni di backtrace oppure di dump a seconda delle esigenze.
# Eseguire il codice per ottenere le informazioni desiderate.
# Eseguire modifiche analoghe in ulteriori file.
# Ripetere quanto ai punti precedenti fino a che non sia individuato e corretto un errore.
# Rimuovere tutto il codice aggiunto e ripristinare il corretto flusso dello stesso.
La procedura esposta risulta essere molto macchinosa ed onerosa in termini di tempo e lavoro. Sarebbe sicuramente cosa gradita poter '''seguire il flusso del codice eseguito dall'interprete senza essere obbligati a modificarlo'''. Impossibile a meno di non installare e configurare alcuni strumenti addizionali. Molti degli strumenti esistenti e liberamente scaricabili si basano su [[xdebug]], software che sarà oggetto di un futuro articolo in cui si descriverà la procedura di installazione e configurazione e le integrazioni con altri strumenti di sviluppo.
Per commenti, consigli, domande inviate una e-mail all'indirizzo ''studiosg [chiocciola] giustetti [punto] net''.
Link esterni
----
* [http://www.php.net Home page del linguaggio PHP]
* [http://php.net/manual/it/ Manuale del linguaggio PHP]
----
Lingue: [http://www.giustetti.net/wiki/index.php?title=En/php_debug English] - '''Italiano'''