Una shell in PHP

20 marzo 2006

Gestire gli errori

È una buona idea impostare una funzione di help ed una per la stampa a video degli errori.
Possiamo decidere se utilizzarla anche per il debug con una serie di livelli di errore visualizzabili impostabile dinamicamente oppure se predisporre soltanto errori fatali che facciano terminare il programma.

function help(){
   echo “Utilizzo del programma: NomeDelProgramma [eventuali parametri]”, “\n”;
   die();
}


function errore($messaggio, $livello = 2){
   // $livello -> 1: Errore fatale, 2: Errore, 3: Debug
   if( $GLOBALS[‘LivelloErrore’] <= $livello or $livello == 1 ){
      echo $messaggio, “\n”;
   }
   if( $livello == 1 ){
      help();
   }
}

Potremmo decidere anche di non generare messaggi di errore a video ma di salvarli in un file di testo: ci basterà modificare la funzione errore().

Gestire le incompatibilità

Come abbiamo visto in precedenza ci sono delle incompatibilità per quanto riguarda le versioni CGI e CLI, sarebbe una buona cosa creare una funzione ad hoc che rimedi a queste incompatibilità :

function compatibile(){
   $sapi = php_sapi_name(); // Server API (cgi, apache, cli, o altro)
   $version = phpversion();


   if( $sapi != ‘cli’ or version_compare($version, ‘4.3.0’, ‘<‘) ){
      set_time_limit(0);
      if( !defined(‘STDIN’) ) define(STDIN, fopen(‘php://stdin’, ‘r’));
      if( !defined(‘STDOUT’) ) define(STDOUT, fopen(‘php://stdout’, ‘w’));
      if( !defined(‘STDERR’) ) define(STDERR, fopen(‘php://stderr’, ‘w’));
      register_shutdown_function( create_function(”,
                     ‘fclose(STDIN); fclose(STDOUT); fclose(STDERR); return true;’) );
      $GLOBALS[‘argc’] = $_SERVER[‘argc’];
      $GLOBALS[‘argv’] = $_SERVER[‘argv’];
   }
}

Gestire i parametri esterni

Molti programmi (specialmente quelli in stile unix) sono progettati per funzionare senza interattività ma semplicemente con dei parametri passati al momento della chiamata.

Esempio: “ProgrammaConta -finoa 10”

Possiamo usare due funzioni che ci aiutano a trovare elementi in un array: in_array() e array_search(). La differenza tra le due è rappresentata dal fatto che la prima restituisce un valore booleano positivo in caso di riscontro nell’array e negativo nel resto dei casi, mentre array_search() restituisce l’indice dell’array. Nel nostro esempio troviamo utile la seconda funzione dato che il parametro passato è formato da più di un elemento (‘-finoa’ e ’10’) e non solamente da un “flag di attivazione”.

$FinoA = 5; // Valore predefinito
if( in_array(‘-finoa’, $argv) ){
   $pos = array_search(‘-finoa’, $argv);
   $FinoA = $argv[$pos+1];
}

Prima di far eseguire al programma istruzioni inutilmente dovreste accertarvi che i parametri siano nel numero giusto oltre che del tipo aspettato. Ad esempio se avete bisogno di un parametro più il nome di un file di testo su cui agire, prima dovete controllare che $argc sia almeno uguale a 3, in secondo luogo che sia presente il parametro obbligatorio. Dopo di che potete controllare l’esistenza del file con file_exists() e accertarvi che si tratti proprio di un file con is_file().

Se vuoi aggiornamenti su Una shell in PHP inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Una shell in PHP

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy