PHP/Cli
Per PHP-CLI si intende la capacità di PHP di lavorare come command line interpreter (CLI, appunto), ovvero di eseguire script dalla riga di comando.
Primi passi
modificaConsideriamo per esempio il seguente semplice script PHP:
#!/usr/local/bin/php
<?php
for ($i = 0; $i < 10; $i++) {
echo "number is $i\n";
}
?>
Questo semplice script dovrebbe essere facilmente comprensibile, tranne per la prima riga, che verrà trattata più avanti.
Possiamo eseguire questo script come abbiamo fatto normalmente fino ad ora, ovvero da pagina web: caricandolo, otterremo una semplice pagina con stampate 10 righe di testo.
La peculiarità analizzata in questo modulo è quella di poter eseguire questo script dalla riga di comando, come la shell di Linux o il prompt dei comandi di Windows: in questo modo otterremmo sempre lo stesso output (10 righe di testo) ma saranno stampate, anziché sul browser, sulla schermata del prompt.
Inoltre questo sistema non necessita neanche l'uso del web server, in quanto la richiesta non passa dal server web ma va direttamente al motore PHP.
Per eseguire lo script sotto Windows, è sufficiente spostarsi nella directory in cui abbiamo salvato il file ed eseguire:
> php nomefile.php
In questo modo otterremo l'output che ci saremmo aspettati:
> php nomefile.php number is 0 number is 1 number is 2 number is 3 number is 4 number is 5 number is 6 number is 7 number is 8 number is 9
Per eseguire lo script sotto Linux, entra in gioco la prima riga di codice lasciata in sospeso in precedenza.
#!/usr/local/bin/php
Questa riga indica che lo script deve essere passato e parsato dal motore PHP: per questo forniamo il nome dell'eseguibile del PHP, che solitamente si trova nella cartella !/usr/local/bin (ma non è detto). A questo punto basterà spostarsi nella cartella in cui abbiamo salvato il file e digitare:
$ ./nomefile.php
Otterremo così l'output desiderato
Ottenere valori dai parametri
modificaUna funzionalità interessante del CLI è quella di ricevere parametri in ingresso, ad esempio digitando:
> php nomefile.php param1 param2
PHP per ottenere il valore dei parametri mette a disposizione, come nel linguaggio C, due variabili:
- $argv (arguments values) è un array che contiene i valori degli argomenti passati; $argv[0] contiene il nome dello script (es. nomefile.php).
- $argc (arguments count) indica il numero di parametri passati allo script (compreso il nome dello script)
#!/usr/local/bin/php
<?php
echo "ho ricevuto $argc argomenti";
for ($i = 0; $i < $argc - 1; $i++) {
echo "il valore dell'argomento $i è ".$argv[$i]."\n";
}
?>
Ad esempio:
> nomefile.php abc 123 ho ricevuto 3 argomenti il valore dell'argomento 0 è nomefile.php il valore dell'argomento 1 è abc il valore dell'argomento 2 è 123
Eseguire un comando
modificaUn'interessante funzionalità offerta dal CLI di PHP è quella di poter eseguire un comando della shell e ottenere la stringa che questo restituisce. Ad esempio:
#!/usr/local/bin/php
<?php
echo shell_exec("dir");
?>
Questo semplice script esegue il comando DIR e poi ne stampa l'output.
Ad esempio, tramite queste funzioni, possiamo ottenere i file presenti nella cartella e memorizzarli in un array tramite la funzione explode
:
$dir_output = shell_exec("dir");
$dir = explode("\n", $dir_output);
print_r($dir);
Input e output
modificaAbbiamo visto finora come ottenere un input tramite i parametri passati eseguendo lo script; e se volessimo invece ottenere input durante l'esecuzione del programma? In questo caso dobbiamo ragionare un po' come un programmatore in C, per il quale ottenere input e output non consiste in altro che leggere o scrivere sugli stream (flussi), trattabili come dei file.
In PHP esistono tre flussi di input/output:
Flusso | Corrisponde a | Nome del file |
---|---|---|
Input standard (sola lettura) | Immissione da tastiera | php://stdin
|
Output standard | Console/terminale | php://stdout
|
Errore standard | Console o registro di sistema | php://stderr
|
Per leggere o scrivere su questi file usiamo le funzioni fwrite
e fgets
, aprendo all'inizio dello script i file tramite fopen
:
//all'inizio apro il flusso...
$stdin = fopen('php://stdin', 'r');
//codice su codice...
echo "inserisci il tuo nome";
$nome = trim(fgets($stdin, 100));
if (!(is_string($nome)) { //è per esempio un numero
$stderr = fopen('php://stderr', 'w');
fwrite($stderr, 'Errore: il nome deve essere una stringa');
}