PHP non è solo un linguaggio di sviluppo per il Web e può essere utilizzato anche come soluzione per lo scripting da riga di comando.
Prima di analizzare le modalità d'impiego e le sue potenzialità dobbiamo assicurarci che l'eseguibile sia correttamente raggiungibile dalla nostra shell. Apriamo quindi il Terminale e proviamo a lanciare il comando:
php -v
In base alla versione di PHP che abbiamo installato sulla nostra macchina otterremo un risultato simile al seguente:
~ → php -v
PHP 7.1.7 (cli) (built: Jul 15 2017 18:08:09) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
Nel caso dovessimo ottenere un errore simile a command not found
ciò significherebbe che probabilmente l'eseguibile non è stato inserito tra i path del sistema. Per risolvere il problema è necessario verificare i passaggi eseguiti durante l'installazione, seguendo le indicazioni di questa guida.
Modalità di utilizzo da riga di comando
Le modalità di utilizzo di PHP da riga di comando sono principalmente 3:
- esecuzione di codice direttamente dalla command line;
- esecuzione del codice direttamente dallo standard input (stdin);
- esecuzione di uno script da file.
Esecuzione di codice dalla command line
Usando il parametro -r
possiamo far eseguire qualunque istruzione PHP al terminale:
php -r 'echo "hello world";'
hello world%
Esecuzione del codice dallo standard input
Supponendo di avere dei comandi che rilasciano in output codice PHP, questo può essere fornito direttamente all'eseguibile del linguaggio tramite pipe (|
),
echo "<?php echo 'hello world'; ?>" | php
hello world%
Esecuzione di script da file
Qualsiasi file PHP può essere eseguito direttamente da Terminale attraverso il comando:
php file.php
Al file è possibile passare anche dei parametri che possono essere utilizzati dallo script.
Analizziamo un esempio pratico così da semplificarne la comprensione. Supponiamo di dover realizzare uno script che ritaglia una porzione di immagine e la salva all'interno di una directory. Questo script potrebbe prendere in input il path dell'immagine e la directory di destinazione.
Lo script potrebbe quindi essere richiamato in questo modo:
php resize.php /path/to/image.jpg /save/to/directory/
Per recuperare i parametri all'interno del nostro script PHP mette a disposizione 2 variabili globali:
$argv
: un array che contiene gli argomenti;$argc
: un intero che indica il numero di argomenti contenuti nell'array$argv
.
Creiamo un file resize.php
in cui per iniziare facciamo stampare gli argomenti passati in ingresso:
<?php
var_dump($argc, $argv);
Lanciamo lo script, il risultato che otterremo è il seguente:
php resize.php /path/to/image.jpg /save/to/directory/
int(3)
array(3) {
[0]=>
string(10) "resize.php"
[1]=>
string(18) "/path/to/image.jpg"
[2]=>
string(19) "/save/to/directory/"
}
Possiamo notare che il primo elemento nell'array è il nome del file, questo viene inserito automaticamente da PHP. Gli altri 2 sono esattamente i parametri che abbiamo fornito noi.
Iniziamo quindi a realizzare lo script, come prima cosa facciamo il parsing dei parametri per ottenere il nome dell'immagine e la directory in cui salvarla:
if ($argc != 3) {
die('Numero di parametri non corretto');
}
list($scriptName, $imagePath, $destinationPath) = $argv;
Attraverso il costrutto list
andiamo a salvare i parametri all'interno di alcune variabili che utilizzeremo nello script. Prima di procedere verifichiamo che il file esista e che la directory di destinazione sia scrivibile e poi eseguiamo il codice per il crop:
$handle = imagecreatefromjpeg($imagePath);
$size = min(imagesx($handle), imagesy($handle));
$imageCropped = imagecrop($handle, [
'x' => 0,
'y' => 0,
'width' => $size,
'height' => $size,
]);
$destinationImage = sprintf('%s/image_%s.jpg', $destinationPath, rand(0, 100));
imagejpeg($imageCropped, $destinationImage);
Lo script completo è il seguente:
<?php
if ($argc != 3) {
die('Numero di parametri non corretto');
}
list($scriptName, $imagePath, $destinationPath) = $argv;
if (!file_exists($imagePath)) {
die('Immagine non trovata');
}
if (!is_writable($destinationPath)) {
die('Directory di destinazione non scrivibile');
}
$handle = imagecreatefromjpeg($imagePath);
$size = min(imagesx($handle), imagesy($handle));
$imageCropped = imagecrop($handle, [
'x' => 0,
'y' => 0,
'width' => $size,
'height' => $size,
]);
$destinationImage = sprintf('%s/image_%s.jpg', $destinationPath, rand(0, 100));
imagejpeg($imageCropped, $destinationImage);
Abbiamo visto che l'array globale $argv
ci permette di creare script anche molto complessi.
Nel caso volessimo affidarci a qualche libreria che ci semplifica le operazioni di parsing dei parametri in modo da dedicarci solo alla logica del nostro script, possiamo utilizzare la Symfony Console Component.