Indice del libro

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

modifica

Consideriamo 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

modifica

Una 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

modifica

Un'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

modifica

Abbiamo 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');
}