Utilizzo di PHP da linea di comando

Command line usageIntroduzione

L'obiettivo principale di Cli sapi è quello di sviluppare applicazioni shell con PHP. Esistono alcune differenze tra la Cli sapi e le altre SAPI; queste saranno illustrate nel corrente capitolo. Val la pena ricordare che Cli e CGI sono differenti SAPI sebbene condividano il medesimo comportamento in diverse situazioni.

La Cli sapi è abilitata di default con l'opzione --enable-cli, ma può esseredisattivata usando --disable-cli quando si usa il comando ./configure.

Il nome, la posizione, e l'esistenza di eseguibili Cli/CGI differiranno in base a come il PHP sarà installato sul sistema. Per default quando si esegue il make, si compila sia la versione CGI sia la versione Cli e saranno poste rispettivamente in sapi/cgi/php-cgi e sapi/cli/php a partire dalla directory dei sorgenti. Occorre notare che entrambi gli eseguibili sono chiamati php. Ciò che accade durante l'esecuzione di make install dipende dalla linea di configurazione. Se durante la configurazione si è scelto un modulo SAPI, tipo apxs, o si è attivato --disable-cgi, l'eseguibile Cli viene copiato in {PREFIX}/bin/php durante make install, altrimenti in questa cartella sarà posto l'eseguibile CGI. Così, per esempio, se si ha come parametro di configurazione --with--apxs allora l'eseguibile Cli sarà copiato in {PREFIX}/bin/php durante make install. Se si vuole evitare l'installazione dell'eseguibile CGI, utilizzare make install-cli dopo make install. In alternativa si può specificare --disable-cgi nella linea di configurazione.

Nota: Poiché sia --enable-cli sia --enable-cgi sono abilitati per default, avere semplicemente --enable-cli nella linea di configurazione non significa necessariamente che l'eseguibile Cli sia copiato come {PREFIX}/bin/php con l'esecuzione di make install.

La versione Cli viene inserita nella cartella principale, con il nome php.exe in Windows. La versione CGI è chiamata php-cgi.exe. Inoltre, è distribuito un file chiamato php-win.exe se PHP è configurato con --enable-cli-win32. Questo è equivalente alla versione Cli, tranne che php-win non visualizzerà nulla e quindi non vi sarà la finestra di console.

Nota: Quale SAPI ho? Da shell, digitando php -v si avrà l'informazione di quale php si tratta, CGI o Cli. Vedere anche la funzionei php_sapi_name e la costante PHP_SAPI per dettagli.
Nota: Una pagina stile man di Unix è disponibile digitando man php da linea di comando.
Differenze con gli altri SAPI

Le principali differenze tra la Cli SAPI e le altre SAPI sono: A differenza di CGI SAPI, non sono inviate in output delle intestazioni. Mentre nella CGI SAPI esiste un modo per sopprimere le intestazioni HTTP, nella Cli sapi non si ha una opzione per abilitare le intestazioni. Per default Cli parte in modalità silenziosa, si è mantenuto, comunque, l'opzione -q e --no-header per motivi di compatibilità; in questo modo si possono utlizzare i vecchi script CGI. Non cambia la directory di lavoro in quella dello script. (È rimasta l'opzione -C e --no-chdir per compatibilità) Messaggi di errore in formato testo (non formattati in HTML). Esistono alcune direttive del php.ini che sono forzate nell'impostazione dalla Cli sapi poiché non hanno senso nell'ambiente di shell: Direttive del php.ini forzate Direttiva Cli SAPI valore di default Commento html_errors false Il valore predefinito è false, dato che è difficile leggere i messaggi di errore nell'ambiente shell quando sono affogati in tag HTML non interpretati. implicit_flush true In un ambiente shell, è desiderabile che ogni tipo di output proveniente da print, echo e simili sia scritto immediatamente e non venga bufferizzato. Tuttavia è ancora possibile utilizzare le funzioni di buffering dell'output se si desidera ritardare o manipolare lo standard output. max_execution_time 0 (unlimited) PHP nell'ambiente di shell tende ad essere utilizzato per una gamma di scopi molto diverso dalle applicazioni per il Web, e questi possono avere tempi di esecuzione molto lunghi; Il tempo massimo di esecuzione è impostato a infinito. register_argc_argv true Impostare questo parametro a true significa che gli script eseguiti attraverso la Cli CLI SAPI hanno sempre accesso a argc (numero di argomenti passati all'applicazione) e argv (matrice degli argumenti). Le variabili PHP $argc e $argv sono automaticamente impostate ai valori appropriati quando si usa la Cli SAPI. Questi valori possono anche essere trovati nell'array $_SERVER, per esempio: $_SERVER['argv'] output_buffering false Anche se il parametro nel php.ini è impostato a false, le funzioni Output buffering sono disponibili. max_input_time false La Cli PHP non accetta GET, POST o upload di file. Queste direttive non possono essere inizializate con altri valori dal file di configurazione php.ini o da uno personalizzato (se specifictao). Questa è una limitazione perché questi valori di default sono applicati dopo avere esaminato tutti i file di configurazione. Tuttavia i loro valori possono essere cambiati durante l'esecuzione (operazione che non ha senso per queste direttive, ad esempio register_argc_argv). It is recommended to set ignore_user_abort for command line scripts. See ignore_user_abort for more information. Per potere lavorare meglio con le shell, sono state definite delle costanti per gli stream I/O . La Cli sapi non cambia la directory corrente in quella dello script eseguito! Il seguente esempio illustra la diferenza rispetto alla CGI SAPI: <?php // Semplice esempio di test chiamato test.php echo getcwd(), "\n"; ?> Quando si usa la versione CGI, si avrà il seguente output: $ pwd /tmp $ php -q another_directory/test.php /tmp/another_directory Questo evidenzia chiaramente come il PHP cambi la directory corrente con quella in cui si trova lo script. Utilizzando la versione Cli sapi abbiamo: $ pwd /tmp $ php -f another_directory/test.php /tmp Questo permette una grande flessibilità nello scrivere tools in PHP. La CGI SAPI supporta il comportamento della Cli sapi attivando l'opzione -C quando viene eseguito da linea di comando.

Opzioni della linea di comandoOpzioni

L'elenco completo delle opzioni del PHP disponibili da linea di comando può essere visualizzato in qualsiasi momento eseguendo il PHP con l'opzione -h: Usage: php [options] [-f] <file> [--] [args...] php [options] -r <code> [--] [args...] php [options] [-B <begin_code>] -R <code> [-E <end_code>] [--] [args...] php [options] [-B <begin_code>] -F <file> [-E <end_code>] [--] [args...] php [options] -- [args...] php [options] -a -a Run interactively -c <path>|<file> Look for php.ini file in this directory -n No php.ini file will be used -d foo[=bar] Define INI entry foo with value 'bar' -e Generate extended information for debugger/profiler -f <file> Parse and execute <file>. -h This help -i PHP information -l Syntax check only (lint) -m Show compiled in modules -r <code> Run PHP <code> without using script tags <?..?> -B <begin_code> Run PHP <begin_code> before processing input lines -R <code> Run PHP <code> for every input line -F <file> Parse and execute <file> for every input line -E <end_code> Run PHP <end_code> after processing all input lines -H Hide any passed arguments from external tools. -S <addr>:<port> Run with built-in web server. -t <docroot> Specify document root <docroot> for built-in web server. -s Output HTML syntax highlighted source. -v Version number -w Output source with stripped comments and whitespace. -z <file> Load Zend extension <file>. args... Arguments passed to script. Use -- args when first argument starts with - or script is read from stdin --ini Show configuration file names --rf <name> Show information about function <name>. --rc <name> Show information about class <name>. --re <name> Show information about extension <name>. --rz <name> Show information about Zend extension <name>. --ri <name> Show configuration for extension <name>.

Opzioni della linea di comando, Parametro Parametro lungo Descrizione -a --interactive Esegue il PHP in modo interattivo. Per maggiori informazioni, vedere la sezione Shell interattiva . -b --bindpath Percorso per collegamento esterno alla modalità Server FASTCGI (solo CGI). -C --no-chdir Non eseguire chdir nella cartella dello script (solo CGI). -q --no-header Modo silenzioso. Sopprime l'emissione delle intestazioni HTTP (solo CGI). -T --timing Misura il tempo di esecuzione dello script ripetutocount volte (solo CGI). -c --php-ini Con questa opzione si può sia specificare la directory in cui cercare il php.ini o si può specificare un file INI personalizzato (che non deve necessariamente chiamarsi php.ini), ad esempio: $ php -c /custom/directory/ my_script.php $ php -c /custom/directory/custom-file.ini my_script.php Se non si specifica questa opzione, il file viene ricercato nelle directory di default. -n --no-php-ini Ignora del tutto il php.ini. -d --define Questa opzione permette di impostare valori personalizzati per qualsiasi delle direttive di configurazione previste in php.ini. La sintassi è: -d configuration_directive[=value] Example of using -d to set an INI setting # Omettendo il valore si imposta la direttiva data a "1" $ php -d max_execution_time -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(1) "1" # Passando un valore vuoto si imposta la direttiva a "" php -d max_execution_time= -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(0) "" # La direttiva di configurazione viene impostata a qualsiasi valore passato dopo il carattere '=' $ php -d max_execution_time=20 -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(2) "20" $ php -d max_execution_time=doesntmakesense -r '$foo = ini_get("max_execution_time"); var_dump($foo);' string(15) "doesntmakesense" -e --profile-info Genera informazioni estese per il debugger/profiler. -f --file Analizza ed esegue il file passato con l'opzione -f. Questo parametro è opzionale e può essere omesso. Basta fornire il nome del file da eseguire. Al fine di passare argomenti ad uno script, il primo argomento deve essere --, altrimenti PHP li interpreterà come opzioni del PHP. -h e -? --help e --usage Con questa opzione si ha l'elenco dei comandi di linea ed una breve descrizione di questi. -i --info Questa opzione della linea di comando richiama la funzione phpinfo, e ne visualizza il risultato. Se il PHP non funziona correttamente, è opportuno utilizzare php -i per verificare se sono visualizzati messaggi di errore prima o al posto della tabella con le informazioni. Fare attenzione quando si usa la modalità CGI, l'output è in formato HTML e quindi abbastanza abbondante. -l --syntax-check Questa opzione fornisce un metodo pratico per eseguire un controllo sintattico di un dato codice PHP. Se il controllo ha successo, verrà visualizzato il testo No syntax errors detected in LtfilenameGt e alla shell sarà restituito il codice 0. Se si rilevano errori si avrà il testo Errors parsing LtfilenameGt, inoltre si avranno anche i messaggi di errore del parser ed alla shell sarà restituito il codice -1. Questa opzione non rileva errori fatali (tipo funzioni non definite). Occorre utilizzare l'opzione -f se si desidera rilevare gli errori fatali. Questa opzione non è abbinabile all'opzione -r. -m --modules Visualizzazione dei moduli PHP e di Zend integrati (e quindi caricati): $ php -m [PHP Modules] xml tokenizer standard session posix pcre overload mysql mbstring ctype [Zend Modules] -r --run Questa opzione permette l'esecuzione di codice PHP direttamente da linea di comando. I tag PHP di apertura e di chiusura (Lt?php e ?Gt) non sono necessari anzi, se presenti, causano un errore del parser. Quando si utilizza questo metodo occorre prestare attenzione ad evitare collisioni con la sostituzione delle varibili eseguita dalla shell sulla linea di comando. errore di sintassi con l'utilizzo dei doppi apici $ php -r "$foo = get_defined_constants();" PHP Parse error: syntax error, unexpected '=' in Command line code on line 1 Parse error: syntax error, unexpected '=' in Command line code on line 1 In questo caso il problema è dovuto alla sostituzione della variabile eseguita da sh/bash anche quando si usano i doppi apici ". Poiché la variabile $foo non è definita, essa verrà espansa con 'niente' generando il seguente codice PHP: $ php -r " = get_defined_constants();" Il metodo corretto richiede l'uso dell'apice singolo '. Le variabili racchiuse in stringhe delimite dall'apice singolo non vengono espanse da sh/bash. Utilizzo degli apici singoli per impedire la sostituzione delle variabili nella shell $ php -r '$foo = get_defined_constants(); var_dump($foo);' array(370) { ["E_ERROR"]=> int(1) ["E_WARNING"]=> int(2) ["E_PARSE"]=> int(4) ["E_NOTICE"]=> int(8) ["E_CORE_ERROR"]=> [...] Se si utilizzano shell differenti rispetto a sh/bash, si potrebbe incorrere in altri problemi. In tal caso aprite una segnalazione di errore a https://bugs.php.net. Si può facilmente incorrere in problemi utilizzando variabili (shell o PHP) nel codice command-line, o utilizzando le barre rovesciate (backslash) per l'escape, quindi occorre essere molto prudenti. Siete avvertiti. L'opzione -r è disponibile nella Cli sapi ma non nella CGI SAPI. Questa opzione è prevista solo per codice molto semplice, quindi alcune direttive di configurazione (come auto_prepend_file e auto_append_file) sono ignorate in questa modalità. -B --process-begin Codice PHP da eseguire prima di processare stdin. -R --process-code Esegue il codice PHP per ogni linea di input. In questa modalità si hanno due variabili speciali: $argn ed $argi. $argn contiene la linea PHP in elaborazione al momento, mentre $argi contiene il numero di linea. -F --process-file Esegue il file PHP per ogni linea di input. -E --process-end Codice PHP da eseguirsi dopo il processamento dell'input. Utilizzo delle opzioni -B, -R e -E per contare il numero di linea di un progetto. $ find my_proj | php -B '$l=0;' -R '$l += count(@file($argn));' -E 'echo "Total Lines: $l\n";' Total Lines: 37328 -S --server Avvia il web server interno. -t --docroot Specifica la document root per il web server interno. -s --syntax-highlight e --syntax-highlighting Visualizza il sorgente con sintassi colorata. Questa opzione utilizza il meccanismo interno di parsing dei file e produce una versione HTML evidenziata del sorgente dirigendola verso lo standard output. Occorre notare che questa funzione genera dei blocchi di tag HTML LtcodeGt [...] Lt/codeGt e non le intestazioni HTML. Questa opzione non funziona abbinata all'opzione -r. -v --version Utilizzo di -v per recuperare il nome SAPI e la versione di PHP e Zend $ php -v PHP 5.3.1 (cli) (built: Dec 11 2009 19:55:07) Copyright (c) 1997-2009 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies -w --strip Visualizza il sorgente senza gli spazi e i commenti. Questa opzione non funziona abbinata all'opzione -r. -z --zend-extension Carica l'estensione Zend. Soltano se si fornisce un nome di file, il PHP tenta di caricare l'estensione dal corrente percorso di default delle librerie (solitamente, sui sistemi Linux, /etc/ld.so.conf). Se si fornisce un nome di file con percorso assoluto, ls libreria non sarà cercata nella directory di default. Un nome di file con percorso relativo indica al PHP di tentare di caricare l'estensione con percorso relativo alla directory corrente. --ini Visualizza i nomi dei file di configurazione e le cartelle scansionate. Esempio di uso di --ini $ php --ini Configuration File (php.ini) Path: /usr/dev/php/5.2/lib Loaded Configuration File: /usr/dev/php/5.2/lib/php.ini Scan for additional .ini files in: (none) Additional .ini files parsed: (none) --rf --rfunction Visualizza le informazioni della funzione o metodo di classe indicato (es. numero e nome dei parametri). Questa opzione è disponibile solo se PH è stato compilato con il supporto alla Reflection. semplice utilizzo di --rf $ php --rf var_dump Function [ <internal> public function var_dump ] { - Parameters [2] { Parameter #0 [ <required> $var ] Parameter #1 [ <optional> $... ] } } --rc --rclass Visualizza le informazioni della classe indicata (lista delle costanti, proprietà e metodi). Questa opzione è disponibile solo se PH è stato compilato con il supporto alla Reflection. Esempio di --rc $ php --rc Directory Class [ <internal:standard> class Directory ] { - Constants [0] { } - Static properties [0] { } - Static methods [0] { } - Properties [0] { } - Methods [3] { Method [ <internal> public method close ] { } Method [ <internal> public method rewind ] { } Method [ <internal> public method read ] { } } } --re --rextension Visualizza le informazioni dell'estensione indicata (elenco delle opzioni php.ini, funzioni, costanti and classi definite). Questa opzione è disponibile solo se PH è stato compilato con il supporto alla Reflection. Esempio di --re $ php --re json Extension [ <persistent> extension #19 json version 1.2.1 ] { - Functions { Function [ <internal> function json_encode ] { } Function [ <internal> function json_decode ] { } } } --rz --rzendextension Visualizza le informazioni di configurazione per l'estensione Zend indicata (le stesse informazioni che sono fornite da phpinfo). --ri --rextinfo Visualizza le informazioni di configurazione per l'estensione indicata (le stesse informazioni che sono fornite da phpinfo). Le informazioni di configurazione del sistema di base sono disponibili usando "main" come nome d'estensione. --ri example $ php --ri date date date/time support => enabled "Olson" Timezone Database Version => 2009.20 Timezone Database => internal Default timezone => Europe/Oslo Directive => Local Value => Master Value date.timezone => Europe/Oslo => Europe/Oslo date.default_latitude => 59.930972 => 59.930972 date.default_longitude => 10.776699 => 10.776699 date.sunset_zenith => 90.583333 => 90.583333 date.sunrise_zenith => 90.583333 => 90.583333

Nota: Le options -rBRFEH, --ini e --r[fcezi] sono disponibili solo in modalità Cli.
Executing PHP filesUsage

Ci sono tre differenti modi per fornire alla Cli sapi il codice PHP da eseguire: Dire al PHP di eseguire un file. $ php my_script.php $ php -f my_script.php Entrambi i metodi (con o senza l'opzione -f) eseguono il file my_script.php. Si può scegliere qualsiasi nome per lo script da eseguire - non è obbligatorio che gli script PHP finiscano con l'estensione .php. Se si ha la necessità di passare degli argomenti allo script quando si usa l'opzione -f, il primo argomento deve essere --. Passare il codice PHP da eseguire direttamente da linea di comando. $ php -r 'print_r(get_defined_constants());' Occorre prestare molta attenzione alla sostituzione delle variabili di shell e all'uso degli apici. Osservando con attenzione l'esempio si nota l'assenza dei tag di inizio e fine! L'opzione -r non li richiede. L'uso dei tag genera un errore di parsing. Si può passare il codice PHP da eseguire via standard input (stdin). Questo da la possibilità di generare dinamicamente del codice PHP e passarlo all'eseguibile, come illustrato nel seguente esempio (fittizio): $ some_application | some_filter | php | sort -u > final_output.txt Non si possono combinare tra loro questi tre metodi di esecuzione del codice.

Come qualsiasi applicazione di shell, anche l'eseguibile PHP accetta diversi argomenti, ma anche lo script PHP può ricevere argomenti. Il numero degli argomenti che possono essere passati allo script non è limitato dal PHP (e anche se la shell ha un limite nel numero di caratteri che possono essere passati, solitamente non si raggiunge questo limite). Gli argomenti passati allo script sono disponibili nell'array globale $argv. L'indice zero contiene sempre il nome dello script come è stato chiamato dalla linea di comando. Si noti che se il codice è eseguito in-line usando l'opzione -r il valore dei $argv[0] sarà un trattino (-). Lo stesso avviene se il codice è eseguito attraverso un pipe dallo STDIN.

Una seconda variabile globale, $argc, contiene il numero degli elementi nella matrice $argv (non è il numero degli argomenti passati allo script).

Fino a quando gli argomenti passati allo script non iniziano con il carattere - non si deve prestare alcuna cautela. Tuttavia se si passa allo script argomenti che iniziano con - si hanno dei problemi perché lo stesso PHP ritiene di doverli gestire, anche prima di eseguire lo script. Per evitare ciò occorre utilizzare il separatore di argomenti --. Dopo che il PHP ha incontrato questo separatore, ogni argomento verrà passato direttamente allo script.

# Questo non visualizzerà il codice passato, ma l'elenco delle opzioni $ php -r 'var_dump($argv);' -h Usage: php [options] [-f] <file> [args...] [...] # Questo passerà il '-h'allo script ed eviterà al PHP di visualizzare le opzioni $ php -r 'var_dump($argv);' -- -h array(2) { [0]=> string(1) "-" [1]=> string(2) "-h" }

Tuttavia esiste un'altro modo per eseguire gli script PHP. Si può scrivere uno script la cui prima riga inizi con #!/usr/bin/php. Seguendo questa regola si può posizionare il normale codice PHP tra i tag di apertura e chiusura del PHP. Una volta impostati correttamente gli attributi del file (ad esempio chmod +x test) lo script può essere eseguito come una normale shell o script perl:

Eseguire uno script PHP come shell script



#!/usr/bin/php
<?php
var_dump($argv);
?>

   

Supponendo che questo file sia chiamato test nella directory corrente, si può eseguire:

$ chmod +x test $ ./test -h -- foo array(4) { [0]=> string(6) "./test" [1]=> string(2) "-h" [2]=> string(2) "--" [3]=> string(3) "foo" }

Come si può notare in questo caso non vi è necessità di prestare attenzione nel passare i parametri che iniziano con -.

L'eseguibile PHP può essere utilizzato per eseguire script PHP in modo indipendente dal server web. Se ci si trova su sistemi Unix, si deve aggiungere allo script una prima linea contentente lo "shebang" #! in modo che il sistema sappia quale programma deve interpretare lo script. Sui sistemi Windows si può associare php.exe all'estensione .php, o si può scrivere un batch per eseguire gli script tramite PHP. La prima riga inserita per i sistemi Unix non crea problemi in Windows (dal momento che è formattata com un commento PHP), in questo modo si possono scrivere batch multi-piattaforma. Qui sotto è mostrato un semplice esempio di programma PHP da linea di comando.

Script sviluppato per essere eseguito da linea di comando (script.php) #!/usr/bin/php <?php if ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) { ?> Questo è uno script PHP da linea di comando con una opzione. Utilizzo: <?php echo $argv[0]; ?> <option> <option> può essere qualsiasi parola che si desidera stampata. Con --help, -help, -h, o -? si ottiene questo aiuto. <?php } else { echo $argv[1]; } ?>

Nello script precedente, abbiamo utilizzato la prima riga per indicare che questo file deve essere interpretato dal PHP. Poiché qui lavoriamo con la versione Cli non vengono prodotte intestazioni HTTP.

Il programma verifica se esiste l'unico il parametro richiesto (in aggiunta al nome dello script, che è ugualmente contato). Se non c'è, o se l'argomento è --help, -help, -h oppure -?, si visualizza il messaggio di aiuto, usando $argv[0] per visualizzare dinamicamente il nome dello script come scritto nella linea di comando. Altrimenti, l'argomento è stampato esattamente come ricevuto.

Se si desidera eseguire lo script precedente su Unix, occorre per prima cosa renderlo eseguibile, e quindi richiamarlo con script.php echothis oppure script.php -h. Su Windows occorre scrivere un batch per ottenere questo risultato:

File batch per eseguire uno script PHP da linea di comando (script.bat) @echo OFF "C:\php\php.exe" script.php %*

Supponendo che il programma precedente si chiami script.php, e che la versione Cli di php.exe sia in C:\php\php.exe, questo batch eseguirà lo script con le opzioni passate: script.bat echothis oppure script.bat -h.

Vedere anche la documentazione del modulo Readline per informazioni su funzioni che possono essere utilizzate per migliorare le applicazioni da linea di comando.

In Windows, PHP può essere configurato per essere eseguito senza fornire il nome C:\php\php.exe o l'estensione .php, come descritto in Linea di comando PHP su Microsoft Windows.

Nota: Su Windows si consiglia di eseguire PHP con un account utente effettivo. Durante l'esecuzione in un servizio di rete, alcune operazioni avranno esito negativo, perché "Non è stata eseguita alcuna mappatura tra i nomi degli account e gli ID di sicurezza".
Flussi Input/outputFlussi I/O

La Cli sapi definisce qualche costante per i flussi I/O per facilitare la programmazione da linea di comando.

Costanti specifiche per CLI Costante Descrizione STDIN Un flusso già aperto allo stdin. Questo evita di aprirlo con <?php $stdin = fopen('php://stdin', 'r'); ?> Se si desidera leggere una singola linea dallo stdin, si può utilizzare <?php $line = trim(fgets(STDIN)); // reads one line from STDIN fscanf(STDIN, "%d\n", $number); // reads number from STDIN ?> STDOUT Un flusso già aperto allo stdout. Questo evita di aprirlo con <?php $stdout = fopen('php://stdout', 'w'); ?> STDERR Un flusso già aperto allo stderr. Questo evita di aprirlo con <?php $stderr = fopen('php://stderr', 'w'); ?>

Stante a quanto descritto non occorre più aprire in autonomia flussi per, ad esempio, lo stderr, ma semplicemente si può usare le costanti anzichè una nuova risorsa di flusso: php -r 'fwrite(STDERR, "stderr\n");' Non occorre chiudere esplicitamente questi flussi, saranno chiusi automaticamente dal PHP alla fine dello script.

Nota: Queste costanti nonsono disponibili se si sta leggendo lo script PHP dallo stdin.
Shell interattiva

La Cli sapi fornisce una shell interattiva quando si usa l'opzione -a se PHP è compilato con l'opzione --with-readline. Da PHP 7.1.0 la shell interattiva è anche disponibile su Windows, se l'estensione readline è abilitata.

Utilizzando la shell interattiva si può digitare codice PHP ed eseguirlo direttamente.

Esecuzione di codice con la shell interattiva



$ php -a
Interactive shell

php > echo 5+8;
13
php > function addTwo($n)
php > {
php { return $n + 2;
php { }
php > var_dump(addtwo(2));
int(4)
php >

   

La shell interattiva fornisce anche il completamento automatic (tab completion) di funzioni, costanti, nomi di classe, variabili, metodi statici e costanti di classe.

Tab completion

Premere il tasto Tab due volte quando ci sono molteplici possibilità di completamento visualizzerà un elenco di questi elementi:



php > strp[TAB][TAB]
strpbrk   strpos    strptime  
php > strp

   

Quando esiste un solo completamento possibile, una pressione sul tasto tab completa il resto della linea:



php > strpt[TAB]ime(

   

Il completamento funziona anche per il nomi che sono stati definiti durante la sessione corrente della shell:



php > $fooThisIsAReallyLongVariableName = 42;
php > $foo[TAB]ThisIsAReallyLongVariableName

   

La shell interattiva archiva lo storico che può essere consultato usando i tasti su e giù. Lo storico è salvato nel file ~/.php_history.

La Cli sapi mette a disposizione le impostazioni php.ini cli.pager e cli.prompt. Il valore cli.pager permette ad un programma esterno (come less) di agire come un paginatore per l'output invece di visualizzarlo direttamente sullo schermo. Il parametro cli.prompt permette di cambiare il prompt php Gt.

È anche possibile impostare le impostazioni di php.ini nella shell interattiva utilizzando una notazione abbreviata.

Impostare i valori del nella shell interattiva

Il parametro cli.prompt:



php > #cli.prompt=hello world :> 
hello world :> 

   

Utilizzando gli apici inversi è possibile eseguire codice PHP nel prompt:



php > #cli.prompt=`echo date('H:i:s');` php > 
15:49:35 php > echo 'hi';
hi
15:49:43 php > sleep(2);
15:49:45 php > 

   

Impostazione del paginatore a less:



php > #cli.pager=less
php > phpinfo();
(output displayed in less)
php > 

   

Il parametro cli.prompt ammette alcune sequenze di escape: Sequenze di escape di cli.prompt Sequenza Descriztione \e Usata per aggiungere colori al prompt. Un esempio può essere \e[032m\v \e[031m\b \e[34m\> \e[0m \v La versione del PHP. \b Indica in che tipo di blocco si trova PHP. Per esempio /* indica che si è in un commento multilinea. L'ambito esterno è indicato da php. \Gt Indica il caratter di prompt. L'impostazione predefinita è Gt, ma cambia quando la shell è all'interno di un blocco non terminato o una stringa. I caratteri utilizzabili sono: ' " { ( Gt

Nota: I file inclusi con auto_prepend_file e auto_append_file sono analizzati in questa modialità ma con qualche restrizione - es. le funzioni devono essere definite prima della chiamata.
Web server interno
Attenzione: Questo server web è stato sviluppato per aiutare lo sviluppo di applicazioni. Può anche essere utile per scopo di test o per dimostrazioni applicative che sono eseguite in ambienti controllati. Non è destinato ad essere un web server con tutte le funzionalità. Non dovrebbe essere usato su una rete pubblica.

La Cli sapi fornisce un web server interno.

Il web server esegue solo un processo con un thread, quindi le applicazioni PHP andranno in stallo se una richiesta è bloccata.

Le richieste URI sono eseguite dalla cartella di lavoro corrente, in cui PHP è stato eseguito, a meno che non sia stata usata l'opzione -t per specificare una radice dei documenti. Se una richiesta URI non specifica un file, allora viene restituito o index.php o index.html nella directory data. Se i file non esistono, la ricerca per index.php e index.html continuerà nella cartella padre e così via finchè non ne viene trovato uno o non viene raggiunto il document root. Se viene trovato un index.php o un index.html, esso viene restituito e viene impostato $_SERVER['PATH_INFO'] alla parte finale dell'URI. In caso contrario viene restituita una risposta con il codice 404.

Se un file PHP viene specificato sulla linea di comando quando viene attivato il web server, viene trattato come script "router" per il web server. Lo script è eseguito all'inizio di ogni richiesta HTTP. Se restituisce false, la risorsa richiesta viene ritornata così com'è. altrimenti viene restituito al browser il risultato dello script.

I tipi MIME standard vengono restituiti per i file con le estensioni: .3gp .apk .avi .bmp .css .csv .doc .docx .flac .gif .gz .gzip .htm .html .ics .jpe .jpeg .jpg .js .kml .kmz .m4a .mov .mp3 .mp4 .mpeg .mpg .odp .ods .odt .oga .ogg .ogv .pdf .png .pps .pptx .qt .svg .swf .tar .text .tif .txt .wav .webm .wmv .xls .xlsx .xml .xsl .xsd .zip .

As of PHP 7.4.0, the built-in webserver can be configured to fork multiple workers in order to test code that requires multiple concurrent requests to the built-in webserver. Set the PHP_CLI_SERVER_WORKERS environment variable to the number of desired workers before starting the server.

Nota: This feature is not supported on Windows.
Attenzione: This experimental feature is not intended for production usage. Generally, the built-in Web Server is not intended for production usage.

Avvio del web server



$ cd ~/public_html
$ php -S localhost:8000

   

Il terminale mostrerà:

PHP 5.4.0 Development Server started at Thu Jul 21 10:43:28 2011 Listening on localhost:8000 Document root is /home/me/public_html Press Ctrl-C to quit

Dopo le richiste URI per http://localhost:8000/ e http://localhost:8000/myscript.html il terminale mostrerà qualcosa di simile a:

PHP 5.4.0 Development Server started at Thu Jul 21 10:43:28 2011 Listening on localhost:8000 Document root is /home/me/public_html Press Ctrl-C to quit. [Thu Jul 21 10:48:48 2011] ::1:39144 GET /favicon.ico - Request read [Thu Jul 21 10:48:50 2011] ::1:39146 GET / - Request read [Thu Jul 21 10:48:50 2011] ::1:39147 GET /favicon.ico - Request read [Thu Jul 21 10:48:52 2011] ::1:39148 GET /myscript.html - Request read [Thu Jul 21 10:48:52 2011] ::1:39149 GET /favicon.ico - Request read

Notare che prima di PHP 7.4.0, le risorse statiche con collegamenti simbolici non erano accessibili su Windows, a meno che lo script del router non le gestisse.

Esecuzione con una cartella di radice dei documenti specifica



$ cd ~/public_html
$ php -S localhost:8000 -t foo/

   

Il terminale mostrerà:

PHP 5.4.0 Development Server started at Thu Jul 21 10:50:26 2011 Listening on localhost:8000 Document root is /home/me/public_html/foo Press Ctrl-C to quit

Uso di uno script router

In questo esempio, le richieste per delle immagini le mostreranno, ma richieste per file HTML mostreranno "Welcome to PHP":



<?php
// router.php
if (preg_match('/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"])) {
    return false;    // serve la risorsa richiesta così com'è.
} else { 
    echo "<p>Welcome to PHP</p>";
}
?>
   


$ php -S localhost:8000 router.php

   

Controllo dell'Uso del Server Web CLI

Per riutilizzare uno script del router del framework durante lo sviluppo con il web server CLI e successivamente anche con un server web di produzione:



<?php
// router.php
if (php_sapi_name() == 'cli-server') {
    /* route static assets and return false */
}
/* prosegue con le normali operazioni di index.php */
?>
   


$ php -S localhost:8000 router.php

   

Gestione Tipi File Non Supportati

Se si ha bisogno di restituire una risorsa statica il cui tipo MIME non viene gestito dal web server CLI, utilizzare:



<?php
// router.php
$path = pathinfo($_SERVER["SCRIPT_FILENAME"]);
if ($path["extension"] == "el") {
    header("Content-Type: text/x-script.elisp");
    readfile($_SERVER["SCRIPT_FILENAME"]);
}
else {
    return FALSE;
}
?>
   


$ php -S localhost:8000 router.php

   

Accedere Al Web Server CLI Da Macchine Remote

È possibile rendere accessibile il web server sulla porta 8000 per qualsiasi interfaccia con:



$ php -S 0.0.0.0:8000

   
Attenzione: Il server Web integrato non deve essere utilizzato su una rete pubblica.
Ini descriptions title INI settings

Opzioni di configurazione di CLI SAPI Name Default Changeable Changelog cli_server.color "0" INI_ALL

cli_server.color bool Abilita il web server interno di sviluppo all'uso dei codici di colore ANSI nella visualizzazione su terminale.