International PHP Conference Berlin 2025

Executing PHP files

Ci sono tre differenti modi per fornire alla CLI SAPI il codice PHP da eseguire:

  1. 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.

    Nota:

    Se si ha la necessità di passare degli argomenti allo script quando si usa l'opzione -f, il primo argomento deve essere --.

  2. 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.

    Nota:

    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.

  3. 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:

Example #1 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.

Example #2 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:

Example #3 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".

add a note

User Contributed Notes 5 notes

up
59
php at richardneill dot org
11 years ago
On Linux, the shebang (#!) line is parsed by the kernel into at most two parts.
For example:

1: #!/usr/bin/php
2: #!/usr/bin/env php
3: #!/usr/bin/php -n
4: #!/usr/bin/php -ddisplay_errors=E_ALL
5: #!/usr/bin/php -n -ddisplay_errors=E_ALL

1. is the standard way to start a script. (compare "#!/bin/bash".)

2. uses "env" to find where PHP is installed: it might be elsewhere in the $PATH, such as /usr/local/bin.

3. if you don't need to use env, you can pass ONE parameter here. For example, to ignore the system's PHP.ini, and go with the defaults, use "-n". (See "man php".)

4. or, you can set exactly one configuration variable. I recommend this one, because display_errors actually takes effect if it is set here. Otherwise, the only place you can enable it is system-wide in php.ini. If you try to use ini_set() in your script itself, it's too late: if your script has a parse error, it will silently die.

5. This will not (as of 2013) work on Linux. It acts as if the whole string, "-n -ddisplay_errors=E_ALL" were a single argument. But in BSD, the shebang line can take more than 2 arguments, and so it may work as intended.

Summary: use (2) for maximum portability, and (4) for maximum debugging.
up
6
email at alexander-bombis dot de
3 years ago
For Windows:

After the years I also have the fact that I have to use double quotation marks after php -r on Windows shell.

But in the Powershell you can use single or double quotation!
up
4
gabriel at figdice dot org
8 years ago
Regarding shebang:

In both Linux and Windows, when you execute a script in CLI with:

php script.php

then PHP will ignore the very first line of your script if it starts with:

#!

So, this line is not only absorbed by the kernel when the script file is executable, but it is also ignored by the PHP engine itself.

However, the engine will NOT ignore the first #! line of any included files withing your "outer" script.php.
Any "shebang" line in an included script, will result in simply outputting the line to STDOUT, just as any other text residing outside a <?php ... ?> block.
up
3
david at frankieandshadow dot com
8 years ago
A gotcha when using #!/usr/bin/php at the start of the file as noted above:

if you originally edited the file on Windows and then attempt to use it on Unix, it won't work because the #! line requires a Unix line ending. Bash gives you the following error message if it has DOS line endings:
"bash: /usr/local/bin/wpreplace.php: /usr/bin/php^M: bad interpreter: No such file or directory"

(In Emacs I used "CTRL-X ENTER f" then type "unix" and ENTER to convert)
up
2
spencer at aninternetpresence dot net
13 years ago
If you are running the CLI on Windows and use the "-r" option, be sure to enclose your PHP code in double (not single) quotes. Otherwise, your code will not run.
To Top