Ejecute una cadena de código PHP en la línea de comando

6 minutos de lectura

avatar de usuario
Mateo J Morrison

Me gustaría poder ejecutar una línea de código PHP en la línea de comandos de forma similar a cómo funcionan las siguientes opciones:

perl -e "print 'hi';"
python -c "print 'hi'"
ruby -e "puts 'hi'"

Me gustaría poder hacer:

php "echo 'hi';"

He leído que hay un -r opción que puede hacer lo que necesito para php, sin embargo, no parece estar disponible cuando intento usarla. He intentado usar PHP 5.2.13 y PHP 4.4.9 y ninguno tiene un -r opción disponible.

Escribí este script (que llamé run_php.php), que funciona, pero no soy un gran admirador de él solo porque siento que debería haber una forma más “correcta” de hacerlo.

#!/usr/bin/php5 -q
<?php echo eval($argv[1]); ?>

Hay un -r ¿opción? Si es así, ¿por qué no está disponible cuando ejecuto --help? Si no hay -r opción, ¿cuál es la mejor manera de hacer esto (sin escribir un script intermediario si es posible)?


Porque no creo que haya quedado muy claro arriba, el -r la opción es no disponible para mi Aquí está el php -h salida para ambas versiones de PHP que estoy ejecutando.

PHP 4.4.9

Usage: php [-q] [-h] [-s] [-v] [-i] [-f <file>]
       php <file> [args...]
  -a               Run interactively
  -C               Do not chdir to the script's directory
  -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 <file>.  Implies `-q'
  -h               This help
  -i               PHP information
  -l               Syntax check only (lint)
  -m               Show compiled in modules
  -q               Quiet-mode.  Suppress HTTP Header output.
  -s               Display colour syntax highlighted source.
  -v               Version number
  -w               Display source with stripped comments and whitespace.
  -z <file>        Load Zend extension <file>.

PHP 5.2.13

Usage: php [-q] [-h] [-s] [-v] [-i] [-f <file>]
       php <file> [args...]
  -a               Run interactively
  -C               Do not chdir to the script's directory
  -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 <file>.  Implies `-q'
  -h               This help
  -i               PHP information
  -l               Syntax check only (lint)
  -m               Show compiled in modules
  -q               Quiet-mode.  Suppress HTTP Header output.
  -s               Display colour syntax highlighted source.
  -v               Version number
  -w               Display source with stripped comments and whitespace.
  -z <file>        Load Zend extension <file>.

Hay no opción -r. Cuando trato de usar el -r opción me sale:

Error en argumento 1, char 2: opción no encontrada r

Perdón por la confusion.

  • ¿En qué sistema operativo está ejecutando esto?

    – tienda de comestibles toda la noche

    2 de junio de 2010 a las 2:01

  • @Matthew J Morrison, ¿es este su servidor o un servidor alojado?

    – tienda de comestibles toda la noche

    2 de junio de 2010 a las 2:20

  • @Inkspeak: es un servidor alojado (porque soy barato)

    – Matthew J. Morrison

    2 de junio de 2010 a las 2:31

  • @Matthew J Morrison, sospecho, como sugieren la otra respuesta y los comentarios, que su PHP se compiló sin compatibilidad con CLI. Es posible que su proveedor de alojamiento lo haya hecho por motivos de seguridad.

    – tienda de comestibles toda la noche

    2 de junio de 2010 a las 2:54

  • @Inkspeak ese parece ser el caso. ¡Gracias!

    – Matthew J. Morrison

    2 de junio de 2010 a las 2:59

avatar de usuario
Artefacto

Sí, está allí en CLI SAPI de PHP 5.2.

Si no puedes actualizar y es que no existe tal opción en PHP 5.2 (no la tengo a la mano para probar), puedes hacer esto:

echo "<?php echo \"hi\\n\";" | php

hi

Original:

De hecho, hay un -r opción (aunque no estoy seguro acerca de PHP 5.2):

php -r "echo 'hi';";

hi

Solo asegúrese de estar usando la versión de línea de comandos de PHP. php --version debería darte algo como esto (nota “cli”):

php --version

PHP 5.3.0 (cli) (built: May 20 2010 19:05:12) (DEBUG)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies

  • ¿Puede explicar qué significa realmente (cli)? Estoy bastante seguro de que ese es mi problema. Mi salida –version para ambas versiones dice (cgi).

    – Matthew J. Morrison

    2 de junio de 2010 a las 2:20

  • @Matthew J Morrison Es el SAPI que se construye cuando compilas PHP con el --enable-cli opción.

    – Artefacto

    2 de junio de 2010 a las 2:24

  • ¿Significa eso que si mi instalación de PHP no se combinó con la opción –enable-cli que no hay una configuración posterior a la compilación para habilitar cli?

    – Matthew J. Morrison

    2 de junio de 2010 a las 2:34

  • @Matthew J Morrison Es un binario separado. Tal vez esté en su sistema con un nombre/ubicación diferente, tal vez no.

    – Artefacto

    2 de junio de 2010 a las 2:38

  • El enlace está muerto ahora.

    – KiranRS

    26 de noviembre de 2020 a las 10:37

En las nuevas versiones de PHP, simplemente escriba “php -a” y salte a un modo interactivo, donde puede experimentar con PHP.

avatar de usuario
Sumoanand

No se requiere un punto y coma adicional al final.

puedes mencionar php -r "echo 'hi';" en vez de php -r "echo 'hi';";

Otro ejemplo (para obtener la marca de tiempo actual en la línea de comando):

php -r 'print time()."\n";'

avatar de usuario
benubird

La forma más sencilla de hacerlo es utilizar el -r bandera. Sin embargo, descubrí que no permite entradas multilínea. Para evitar eso, puede hacer esto:

php -r "passthru(file_get_contents('php://stdin'));"

Lo que le permite canalizar desde la entrada estándar, así:

echo -n "echo 'test';" | php -r "passthru(file_get_contents('php://stdin'));"

Sin embargo, para responder a la pregunta original, si no tiene la -r bandera disponible, también es posible usar la bandera -f – simplemente pase la entrada estándar como el archivo para abrir: php -f /dev/stdin

Si hace esto, tenga en cuenta que a) debe incluir un espacio en blanco al comienzo de la entrada y b) debe abrir con <?php. Ejemplo:

echo -ne " <?php\necho 'test';" | php -f /dev/stdin

avatar de usuario
allnightgrocery

Echa un vistazo a esta página en Características de la línea de comandos de PHP, si aún no lo has hecho. Hay algunas publicaciones sobre problemas basados ​​en el sistema operativo y comillas simples o dobles.

También revisaría la información de PHP

php -i

para ver si PHP era compilado con soporte CLI deshabilitado (–disable-cli).

  • El segundo enlace está roto (404).

    -Peter Mortensen

    14/09/2021 a las 21:17

avatar de usuario
Mono codificado

recientemente encontré psicópataque es un depurador interactivo también disponible desde la línea de comandos.

  • El segundo enlace está roto (404).

    -Peter Mortensen

    14/09/2021 a las 21:17

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad