Un semplice strumento per il debug
Chi, come me, è alle prime armi con PHP si scontra subito con la mancanza di un tool per eseguire il debug; personalmente trovo che la possibilità di eseguire passo a passo un'applicazione sia utile non solo per scovare gli errori di programmazione ma anche per capire il funzionamento di programmi già esistenti.
Questo articolo presenta un sistema estremamente semplice per ottenere un log online della vostra applicazione: non è proprio come l'esecuzione passo a passo ma può comunque risultare molto utile.
ll sistema si basa su due componenti:
- una funzione (loggy()) da inserire
nel vostro progetto e da richiamare nei punti di interesse;
- un server TCP/IP (scritto
ovviamente in PHP!) che raccoglie le varie stringhe inviate dalla
funzione loggy().
Questo sistema esisteva già in
PHP3 a quanto pare: la funzione error_log(), infatti, permetteva di
spedire informazioni di debug ad un server TCP, ora non più.
Dando un'occhiata al codice di loggy()
si nota che il funzionamento è molto semplice:
function loggy( $logstr )
{
//--------------------------------------
$localname = "localhost";
$serveraddr = "127.0.0.1";
$serverport = 2000;
//--------------------------------------
$sock = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if( $sock < 0 )
return;
@socket_bind($sock, $localname);
@socket_connect($sock, $serveraddr, $serverport);
@socket_write($sock, $logstr . "\r\n" );
@socket_close( $sock );
}
E' sufficiente configurare
correttamente le seguenti variabili:
- $localname è il nome della
macchina su cui gira l'applicazione;
- $serveraddr e $serverport
specificano indirizzo IP e porta del server.
L'utilizzo è molto semplice: basta richiamare la funzione loggy() passandole una stringa con le informazioni che si vogliono ottenere, allo stesso modo in cui si farebbe con echo.
Il server deve essere lanciato a parte; salvate lo script seguente come logserver.php e lanciatelo con "php logserver.php":
<?php
//------------------------------------------------------------------------------
// server per ricezione stringhe di log
//------------------------------------------------------------------------------
$address = "localhost";
$port = "2000";
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if( $sock < 0 )
{
echo "Errore socket_create(): " . socket_strerror( $sock ) . "\n\r";
die();
}
$ret = socket_bind( $sock, $address, $port );
if( $ret < 0 )
{
echo "Errore socket_bind(): " . socket_strerror( $ret ) . "\n\r";
socket_close( $sock );
die();
}
$ret = socket_listen( $sock, 1 );
if( $ret < 0 )
{
echo "Errore socket_listen(): " . socket_strerror( $ret ) . "\n\r";
socket_close( $sock );
die();
}
echo "Server started!n";
do
{
// attesa connessione
$sockclient = socket_accept($sock);
if( $sockclient < 0 )
{
echo "Errore socket_accept(): " . socket_strerror( $sockclient ) . "\n\r";
socket_close( $sock );
break;
}
// ricezione stringa
do
{
$buf = socket_read( $sockclient, 1024, 0 );
if( $buf == "" )
break;
echo $buf;
} while( true );
} while( true );
socket_close( $sock );
?>
E questo è tutto!
PHP-nuke
Ho utilizzato questo sistema per
verificare il funzionamento di alcune parti del mio sito
(praticamente il modulo Gallery). In particolare, ho inserito la funzione
loggy() direttamente in mainfile.php in maniera da poter utilizzare questa funzionalità in qualsiasi punto del sito, senza modificare l'effetto finale a video (cosa che puņ succedere con delle echo piazzate malamente).
Conclusioni
Ovviamente non ho inventato niente di
nuovo, spero che questo semplice sistema possa aiutare qualcuno alle prime armi con il linguaggio PHP.
Attenzione al fatto che alcuni messaggi potrebbero venir persi se logserver.php dovesse gire su una macchina particolarmente lenta: la soluzione potrebbe essere quella di smembrare la funzione loggy() per usare un socket creato all'inizio del programma e liberato all'uscita.
Copyright © by Sebastien Costa All Right Reserved.