PHP 8.3.21 Released!

Ejecución de archivos PHP

Hay 3 formas diferentes de llamar al CLI SAPI con código PHP a ejecutar:

  1. Indicar a PHP que ejecute un archivo dado:

    php mon_script.php
    
    php -f mon_script.php
    

    Ambos métodos (usando -f o no) ejecutan el script contenido en el archivo mon_script.php. Tenga en cuenta que no existe restricción sobre los archivos que se pueden ejecutar; en particular, no es necesario que la extensión del archivo sea .php.

  2. Dar código PHP a ejecutar directamente en la línea de comandos.

    php -r 'print_r(get_defined_constants());'
    

    En este caso, se debe prestar especial atención a las variables de entorno, que serán reemplazadas, y a las comillas, que tienen significados especiales en la línea de comandos.

    Nota:

    Lea el ejemplo con atención, ¡no hay etiquetas de apertura ni de cierre! La opción -r hace que el uso de estas etiquetas sea innecesario, y agregarlas conduciría a un error de análisis sintáctico.

  3. Alimentar la entrada estándar con código PHP (stdin).

    Esto proporciona la posibilidad de crear código PHP dinámicamente, luego proporcionarlo a PHP y, finalmente, procesarlo nuevamente en el shell. Aquí hay un ejemplo ficticio:

    $ some_application | some_filter | php | sort -u > final_output.txt
    
No es posible combinar estos tres modos de ejecución.

Como cualquier aplicación shell, el ejecutable PHP acepta argumentos; sin embargo, el script PHP también puede recibirlos. El número de argumentos que se pueden pasar a su script no está limitado por PHP (el shell tiene un límite en términos de número de caracteres que se pueden pasar. Generalmente, no alcanzará este límite). Los argumentos pasados al script se transmitirán a través de la variable array $argv. El primer índice (cero) contiene siempre el nombre del script llamado desde la línea de comandos. Tenga en cuenta que, si el código se ejecuta en línea usando la opción de línea de comandos -r, el valor de $argv[0] será "Standard input code"; anterior a PHP 7.2.0, era un guion ("-") en su lugar. Esto también es cierto si el código se ejecuta a través de un pipe desde STDIN.

Una segunda variable global, $argc, contiene el número de elementos del array $argv (y no el número de argumentos pasados a su script).

Mientras los argumentos pasados al script no comiencen con el carácter -, no hay nada especial que vigilar. El hecho de pasar argumentos al script que comienzan con - plantea problemas porque PHP pensará que debe interpretarlos. Para evitar esto, use el separador --. Después de este argumento, todos los argumentos siguientes se pasarán al script sin ser modificados ni analizados por PHP.

# Esto no ejecutará el código, sino que mostrará la ayuda de PHP
$ php -r 'var_dump($argv);' -h
Uso: php [opciones] [-f] <archivo> [args...]
[...]

# Esto pasará el argumento '-h' al script y evitará que PHP lo maneje
$ php -r 'var_dump($argv);' -- -h
array(2) {
  [0]=>
  string(1) "-"
  [1]=>
  string(2) "-h"
}

Sin embargo, hay otra forma de usar PHP como script shell; la primera línea del script debe ser #!/usr/bin/php (a reemplazar por la ruta hacia el binario PHP CLI en el sistema subyacente). El resto del archivo debe contener el código PHP normal, comprendido entre las etiquetas de apertura/cierre. Después de establecer los permisos de ejecución en el script (chmod +x test), puede ejecutarse como un script shell o perl habitual:

Ejemplo #1 Ejecuta un script PHP como script shell

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

Suponiendo que este archivo se llame test, en el directorio actual, entonces es posible hacer esto:

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

Como puede ver, en este caso, no es necesario tener cuidado al pasar parámetros que comienzan con - a su script.

El ejecutable PHP puede ser utilizado para ejecutar scripts independientes del servidor web. Si está en un sistema Unix, se recomienda agregar la línea especial al inicio del script, hacerlo ejecutable de manera que el sistema sepa qué programa debe ejecutar el script. En Windows, puede asociar el ejecutable php.exe con el doble clic en los archivos de extensión .php, o bien puede hacer un archivo batch para ejecutar el script gracias a PHP. La primera línea utilizada en el mundo Unix no perturbará la ejecución en Windows, lo que hace que los scripts sean fácilmente portables. Un ejemplo completo se proporciona a continuación:

Ejemplo #2 Script previsto para ser ejecutado en línea de comandos (script.php)

#!/usr/bin/php
<?php

if ($argc != 2 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
?>

Esto es una línea de comando a una opción.

Uso:
<?php echo $argv[0]; ?> <opción>

<opción> puede ser una palabra que desee mostrar.
Con las opciones --help, -help, -h,
y -?, obtendrá esta ayuda.

<?php
} else {
echo
$argv[1];
}
?>

El script anterior incluye la primera línea especial que indica que este archivo debe ser ejecutado por PHP. Se trabaja aquí con la versión CLI, por lo que no se mostrará ningún encabezado HTTP.

El programa comienza verificando que se haya especificado el argumento requerido (además del nombre del script, que también se cuenta). Si no está presente, o si el argumento es --help, -help, -h o -?, se mostrará un mensaje de ayuda, utilizando $argv[0] para mostrar dinámicamente el nombre del script tal como se ingresó en la línea de comandos. De lo contrario, el argumento se mostrará tal como se ingresó en el terminal.

Para ejecutar el script anterior en Unix, debe hacerlo ejecutable y luego llamarlo con un comando como: script.php echothis o script.php -h. En Windows, puede hacer un archivo batch para esto:

Ejemplo #3 Archivo batch para ejecutar un script PHP en línea de comandos (script.bat)

@echo OFF
"C:\php\php.exe" script.php %*

Suponiendo que el programa anterior se llame script.php, y que el ejecutable CLI php.exe se encuentre en C:\php\php.exe, este archivo batch lo ejecutará con las opciones que le pase: script.bat echothis o script.bat -h.

Vea también la extensión Readline, que dispone de numerosas funciones para mejorar la usabilidad de las aplicaciones PHP en línea de comandos.

En Windows, PHP puede configurarse para funcionar sin necesidad de proporcionar las extensiones C:\php\php.exe o .php, tal como se describe en la línea de comandos PHP bajo Microsoft Windows.

Nota:

En Windows, se recomienda ejecutar PHP bajo una cuenta de usuario. Cuando PHP se ejecuta bajo un servicio de red, algunas operaciones pueden fallar, ya que "No se realiza ninguna vinculación entre los nombres de cuenta y los identificadores de seguridad".

add a note

User Contributed Notes 5 notes

up
59
php at richardneill dot org
12 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
4 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