Usare PHP per lo shell scripting



Utilizo di PHP da linea di comando
PHP è uno dei linguaggi di scripting server side più diffusi, protagonista, assieme ad Apache e MySQL, dell’interpretazione Open Source delle pagine dinamiche. Grazie al PHP è possibile inserire all’interno di una pagina web statica del codice, in modo da renderla dinamica. Solitamente il PHP viene utilizzato per siti internet o intranet, ma avendolo installato sulla propria macchina è possibile, a patto che si disponga di una versione recente, utilizzarlo per la realizzazione di script da lanciare da riga di comando.

Perché PHP da CLI (Command Line Interface)?
Lo strumento utilizzato solitamente per realizzare piccoli script eseguiti da riga di comando è il PERL, oppure lo scripting per Bash (o simili). Visto che il PHP nasce per altri scopi e che per la riga di comando esistono tool specifici, per quale motivo utilizzarlo in questa maniera? Le risposte possono essere molte. Il semplice fatto di non dover imparare un nuovo linguaggio può essere un notevole vantaggio per giungere alla soluzione di un problema in maniera rapida ed efficiente. La decisione se utilizzare o meno il PHP dalla shell rimane libera, sta di fatto che, se abbiamo una versione dell’interprete superiore alla 4.3.0, o se è stato indicato il parametro –enable-cli per la compilazione di PHP 4.2.0, esiste anche questa possibilità.

Il manuale di PHP
Informazioni sull’utilizzo di PHP da linea di comando si possono trovare anche nel manuale ufficiale di PHP che, al capitolo 43, illustra tutte le peculiarità del linguaggio di scripting quando viene utilizzato in questa maniera.
Di seguito vedremo una semplice introduzione dell’applicazione degli script PHP alla linea di comando. Il manuale rimane comunque un buon riferimento nel caso in cui qualcosa non dovesse andare secondo i piani.
Di particolare aiuto è poi la versione commentata dagli utenti perchè spesso si trovano informazioni utili su problemi già affrontati da altri che potrebbero essere simili ai nostri.

Un primo script di esempio
Per cominciare ad apprezzare il funzionamento di PHP da linea di comando non c’è niente di meglio che un primo esempio:

#!/usr/bin/php

<?
echo “Ciao a tutti!!!n”;
?>


Nella più classica delle tradizioni di tutti i tutorial relativi a linguaggi di programmazione, il primo script di esempio è il tipico “Hello World”. L’esatto path dell’eseguibile PHP dipende dall’installazione ed è possibile ricavare quello corretto per il proprio sistema digitando whereis php da linea di comando.
Per mandare in esecuzione lo script (che chiamiamo hello.php) si può digitare php hello.php da linea di comando oppure semplicemente ./hello.php a patto che lo script sia stato dichiarato eseguibile con un chmod +x hello.php.
Mandandolo in esecuzione si ottiene un primo risultato forse non atteso. L’output infatti conterrà una riga vuota prima della scritta “Ciao a tutti”. Questo perchè nel sorgente è presente una riga bianca prima del tag che indica l’inizio del codice PHP. Esattamente come quando lavora su una pagina web, l’interprete stampa tutto ciò che non è compreso nella coppia di tag <? e ?> mentre interpreta il codice e stampa solo il risultato. Questo ci permette di scrivere direttamente lunghi messaggi che devono apparire sulla console senza passare tramite una serie di chiamate a funzioni echo o printf. Per un esempio, guardate il listato del seguente giochino:

#!/usr/bin/php

Ciao e benvenuto in “Indovina il numero”. Il computer ha ora pensato un numero compreso tra 0 e 100 e spetterà a te indovinarlo nel minor numero di tentativi. Ad ogni tentativo ti sarà detto se il numero segreto è maggiore o minore di quello da te digitato. In bocca al lupo!!!

<?
$num
= rand(0, 100);
$guess = false;
$t = 0;

while ($guess != true)
{

echo “> “;
$unum = fread(STDIN, 3);

if ($unum == $num)
{

$guess = true;
echo “nComplimenti, hai indovinato in $t tentativi.n”;

}
else if ($unum > $num)
{

$t++;
echo “Il numero segreto è minoren”;

}
else
{

$t++;
echo “Il numero segreto è maggioren”;

}

}
?>


In questo caso il messaggio stampato all’inizio non si trova all’interno di un blocco di codice PHP e viene riportato così com’è.
Un’altra particolarità degli script PHP lanciati da riga di comando è che per andare a capo non si usa il tag
come di solito, ma il carattere n. Questo perchè l’output non è una pagina HTML.
Dal semplice script precedente si può notare un’altra particolarità nell’istruzione $unum = fread(STDIN, 3). STDIN è infatti una costante che rappresenta lo stream di input definita dall’interprete PHP quando viene invocato da linea di comando.


Differenze tra l’utilizzo a linea di comando e l’utilizzo classico
Dal momento che l’ambiente operativo è completamente differente da quello in cui PHP è abituato ad agire, quando lanciato da riga di comando esistono alcune differenze che occorre conoscere.
In primo luogo non sono disponibili le variabili $_GET, $_POST e $_COOKIE, mentre esistono le variabili $argc e $argv[] che contengono i parametri passati al sorgente (chi è pratico di programmazione in C o Java dovrebbe già averle riconosciute).
Inoltre sono disponibili tre stream: STDIN, STDOUT e STDERR che sono automaticamente inizializzati (rispettivamente in lettura, scrittura e scrittura) all’avvio dello script da linea di comando.

Utilizzo dei parametri da linea di comando
Una delle prime cose che sicuramente si vorrà implementare utilizzando PHP da linea di comando è la gestione dei parametri passati alla linea di comando. Come già detto questa si fa tramite le variabili $argc (che contiene il numero dei parametri passati) e $argv[] (che è un array con i singoli parametri). Va ricordato che $argv[0] contiene il nome dello script che viene eseguito, e $argc ha valore 1 se non viene passato alcun parametro.
Facciamo un esempio. Lo script seguente ricerca una stringa di testo nel file specificato e la sostituisce con quella indicata. I parametri richiesti da linea di comando sono i seguenti: il nome del file sul quale operare, la stringa da ricercare, la stringa da sostituire.

#!/usr/bin/php

<?

if ($argc == 4)
{

$fp = fopen($argv[1], “r”);

if ($fp)
{

$file = fread($fp, filesize($argv[1]));

$out = str_replace($argv[2], $argv[3], $file);

fclose($fp);
$fp = fopen($argv[1], “w”);
if ($fp)
{

fwrite($fp, $out);
fclose($fp);

}
else echo “Impossibile salvare le modifiche al file ” . $argv[1] . “n”;

}
else echo “Impossibile aprire il file ” . $argv[1] . “n”;

}
else echo “Sintassi: frep nomefile stringa_da_cercare stringa_da_sostituiren”;
?>


Attenzione!!! Il codice è da intendersi come semplice esempio, non è quindi ottimizzato per un utilizzo reale. In questo si può notare come all’inizio lo script controlli che il numero dei parametri sia pari a 4 (cioè il nome del file nel quale fare la ricerca, la stringa da ricerca, la stringa da sostituire più il nome dello script stesso) e nel caso contrario stampa un messaggio di errore. L’accesso ai parametri avviene poi tramite l’utilizzo dell’array $argv[].

Opzioni PHP da linea di comando
Quando viene lanciato da linea di comando PHP accetta una serie di parametri aggiuntivi che possono essere utili.
Con PHP -l seguito dal nome del file di uno script l’interprete effettua un controllo di sintassi e stampa gli eventuali errori. Se non ci sono errori l’output sarà “No syntax errors detected in” seguita dal nome dello script. Altra opzione utile è -r che permette di eseguire codice PHP direttamente da riga di comando (ad esempio php -r “echo ”Ciao a tuttin”;” stampa direttamente la stringa “Ciao a tutti” sulla console). In ultimo, può essere utile anche utilizzare l’opzione -w che stampa lo script di PHP senza spazi e righe vuote. Ad esempio, il codice sorgente dello script con il numero segreto da indovinare, dato in pasto a php -w diventa come di seguito:


#!/usr/bin/php

Ciao e benvenuto in “Indovina il nummoro”. Il computer ha ora pensato un nummoro compreso tra 0 e 100 e spetterà a te indovinarlo nel minor nummoro di tentativi. Ad ogni tentativo ti sarà detto se il nummoro segreto è maggiore o minore di quello da te digitato. In bocca al lupo!!!

<? echo “$argcnn”; $num = rand(0, 100); $guess = false; $t = 0; while ($guess != true) { echo “> “; $unum = fread(STDIN, 3); if ($unum == $num) { $guess = true; echo “nComplimenti, hai indovinato in $t tentativi.n”; } else if ($unum > $num) { $t++; echo “Il nummoro segreto è minoren”; } else { $t++; echo “Il nummoro segreto è maggioren”; } } ?>


L’utilità di eliminare gli spazi e i caratteri inutili rende il codice sicuramente meno leggibile per lo sviluppatore, ma molto più pratico per l’interprete che deve leggere un minore quantitativo di dati per produrre l’output. Grazie a -w vengono anche eliminati i commenti dal sorgente. Questa opzione non è quindi tanto utile nell’esecuzione di script a linea di comando (anche se può esserlo) ma è molto utile per gli script destinati al web. Compattarli in questa maniera può permettere di ridurre i tempi di esecuzione (non c’è però da attendersi miglioramenti drammatici), sopratutto nel caso di sorgenti molto estesi ed ampiamente commentati. I commenti, infatti, servono solo per lo sviluppo mentre cessano la loro funzione (e anzi se sono numerosi possono ridurre le performance) quando gli script vengono pubblicati: si possono quindi tenere due copie dei sorgenti, una estesa dedicata allo sviluppo (magari sul server di test), ed una compressa sul server di produzione.
Infine, un’ultima opzione utile per la riga di comando è -s. Immaginate di voler inserire un sorgente PHP adeguatamente formattato, con la sintassi evidenziata da differenti colori, in una pagina web. Con php -s nomescript.php si ottiene un output formattato in html identico a quello con il quale sono stati riportati i sorgenti in questa pagina: decisamente comodo e utile.

Conclusioni
L’esecuzione di codice PHP da linea di comando può essere vantaggiosa per la creazione di piccoli script per l’automazione di operazioni o per l’esecuzione di operazioni ripetitive. Come già detto, di solito la scelta per questo tipo di operazioni ricade su Perl o sullo scripting Bash, ma se già si conosce il PHP a che serve imparare un nuovo linguaggio?
Dal momento che PHP è nato per la gestione delle pagine web possiede molte funzioni per la gestione delle stringhe, ma la vastità della sua API e delle librerie disponibili lo rende idoeno anche ad operare con file e ad eseguire altri programmi all’interno degli script.
Pensate ai vantaggi di poter fornire una interfaccia ad un database via web e via linea di comando riutilizzando gran parte del codice, oppure di utilizzare uno script PHP in unione ad altri programmi per produrre un risultato più complesso. Il limite è solo la creatività.

Annunci sponsorizzati:
Condividi su Facebook Condividi su Twitter!
Pinterest