Introduzione a PHP CLI

Tutti sanno che PHP è un linguaggio per lo sviluppo di siti e applicazioni web, ma pochi sanno che in realtà può essere usato anche per creare programmi eseguibili sul desktop e da riga di comando. In questo articolo ci occuperemo appunto di quelli eseguibili da riga di comando. Prima di tutto occorre accertarsi che PHP CLI sia installato (CLI = Command Line Interface). Gli utenti Linux possono farlo molto rapidamente con Synaptic (il pacchetto si chiama php5-cli, non potete proprio sbagliare). Su MacOS X credo sia già installato.

Installazione su Windows

Il metodo qui descritto è quello che userei io; non nego che ha degli effetti collaterali sul vostro sistema, quindi usatelo a vostro rischio, io non sono responsabile delle conseguenze.

  1. Avviare il prompt di DOS, sempre che esista ancora e non sia stato sostituito da un programma grafico, ovviamente lento e malfunzionante.
  2. Scrivere FORMAT C: Probabilmente il disco non si formatterà a causa di un bug, ma tentar non nuoce.
  3. Inserire un CD di una qualche distribuzione di Windows, consiglio Ubuntu, e installare il sistema.
  4. Avviare “Sistema->Amministrazione->Gestore pacchetti Synaptic” e scoprire che è facilissimo installare cose su Linux e che, cosa ancor più strana per uno che viene da Windows, su Linux sai esattamente cosa stai installando e perchè.

Dopo mi ringrazierete. Ma torniamo a CLI…

Eseguire uno script

Le istruzioni che seguono non sono dettagliate. Se avete problemi, fate riferimento al sito di Php o ad altre guide sul web. Ad ogni modo, dovrebbe funzionare per la stragrande maggioranza degli utenti Linux e MacOS X. Auguri agli utenti Windows.

Scriviamo uno script PHP di esempio. Essendo una semplice prova, non importa che sia lungo e intelligente. Lo script seguente andrà benissimo:

<?php
echo 'Hello World!';
?>

Ora, supponiamo che il file si chiami ‘prova.php’ e che lo abbiate salvato in home. Non è un buon posto dove salvarlo, ma questo articolo non parla di una gestione ordinata del proprio sistema, parla solo di CLI, quindi gli amministratori di sistema evitino di scrivermi furiosi. Nel nostro esempio, sulla maggior parte dei sistemi per far funzionare lo script basterà scrivere da riga di comando:

php -f prova.php

Dovrebbe apparire l’output, cioè ‘Hello World!’. Se è tutto a posto andiamo avanti, altrimenti come dicevo fate una piccola ricerca su Internet per risolvere il problema.

Ora parliamo delle particolarità degli script eseguibili attraverso CLI rispetto a quelli che generano pagine Web.

Time Limit

Uno script per riga di comando generalmente viene eseguito da un unico utente, quello che sta seduto davanti al computer. Per questo motivo in genere non dobbiamo preoccuparci troppo delle risorse che consuma. Inoltre, l’esecuzione di uno script interattivo può durare molto. Cosa impedisce all’utente di avviare lo script, andare a farsi un panino, tornare dopo un’ora e continuare a usarlo? Di conseguenza, bisogna che l’esecuzione non abbia limiti di tempo (tranne in casi particolari). Ecco perchè, in genere, gli script per CLI iniziano con la riga seguente:

@set_time_limit(0);

Output

Per scrivere l’output possiamo utilizzare le solite funzioni echo e print. Ovviamente nell’output non inseriremo HTML (che viene interpretato dai browser, non certo dalle shell) e per gli “a capi” useremo i caratteri “\r” (ritorno a capo) e “\n” (nuova riga). Se vogliamo andare a capo di una riga (acapo normale) faremo così: “Hello\r\nWorld!”, se vogliamo andare a capo di due righe (lasciandone una vuota) faremo così: “Hello\r\n\nWorld!”. Il ritorno a capo è uno solo, mentre per ogni riga che vogliamo lasciare inseriremo un “\n”.

Possiamo utilizzare che lo stdout, cioè lo standard output. Su Windows non esiste (Php però lo simula), mentre sui sistemi Unix è il canale di output di default. Generalmente questo canale è il file speciale ‘dev/tty’, che corrisponde allo schermo. Ma in casi particolari lo standard output potrebbe anche essere ridiretto ad altri file speciali (stampante, rete) o anche a un normale file di testo. Se vogliamo scrivere esplicitamente sullo standard output, dobbiamo trattarlo come file:

$fp = fopen('php://stdout');
fputs($stdout, 'Hello World!');

Input

Similmente, quando chiediamo un input all’utente dobbiamo leggere il canale standard input come se fosse un file. Ecco come:

$fp = fopen('php://stdin', 'w');
fgets($fp, 4096); // legge una riga, cioè finchè l'utente non preme INVIO

Parametri

Quando l’utente avvia lo script da riga di comando, potrebbe passare dei parametri. Ad esempio, il tipico parametro che si passa quando non si sa utilizzare un programma è:

php -f prova.php --help

I parametri passati dalla riga di comando sono dentro l’array $argv. L’elemento 0 di questo array è il nome del file contenente il nostro script, gli elementi successivi sono gli array passati, se ce ne sono. Si trovano nello stesso ordine in cui l’utente li ha scritti. La variabile $argc contiene il numero di elementi passati più il nome dello script (corrisponde quindi a count($argv)).

Standard Error

Sui sistemi Unix, esiste un altro canale output particolare: lo standard error. Lì sono diretti tutti i messaggi di errore generati dai vari programmi. Generalmente, per default lo standard error è diretto allo schermo. Su alcuni sistemi Unix credo sia diretto invece a un file di testo, inoltre nulla impedisce di dirigerlo, ad esempio, alla stampante.

Se decidiamo di inviare i nostri messaggi di errore allo standard error perchè l’utente possa riceverli dove desidera, possiamo fare così:

$fp = fopen('php://stderr', 'w');
fputs($fp, 'Errore!');

Moduli da usare in combinazione con CLI

Per migliorare l’interazione con l’utente si possono utilizzare tre interessanti moduli:

  • readline (installato di default);
  • newt (no);
  • encurses (no).

In questo articolo introduttivo non ne parleremo, ma consiglio di studiarli se si intende scrivere script per CLI, altrimenti l’interazione potrebbe risultare molto povera.

Se l’argomento interessa, potrei parlarne in un prossimo articolo.

Tags: ,

2 Responses to “Introduzione a PHP CLI”

  1. tingon Says:

    l’introduzione di php-cli che avete fatto ha piu’ di un anno, l ho trovata molto interessante, ho installato le estensioni newt su php, avete qualche tutorial in merito da suggerirmi, dato che la documentazione su newt e’ veramente poca!!
    qualche script complesso che usa newt giusto per capire come inviare le variabili tra una form e l’altra, …..
    programmo gia’ in php per il web e vorrei avvicinarmi al php-cli per realizzare dei programmi da linea di comando…..

    grazie in anticipo

  2. admin Says:

    Il modulo newt è stato aggiungo di recente a PHP ed è per questo che la documentazione è ancora scarsa.
    Il modulo newt però non è altro che un bridge verso la libreria omonima, perciò puoi fare riferimento alla home page del progetto:
    http://et.redhat.com/~rjones/ocaml-newt/html/Newt.html
    e al tutorial ufficiale:
    http://www.whoow.org/people/Jean-Marc.Lienher/gnewt/tutorial.html

Leave a Reply

*
To prove that you're not a bot, enter this code
Anti-Spam Image