shell_exec passthru examples example ejemplos php command exec

passthru - system php ejemplos



PHP exec() vs system() vs passthru() (5)

¿Cuáles son las diferencias?

¿Hay una situación específica o razón para cada función? En caso afirmativo, ¿puedes dar algunos ejemplos de esas situaciones?

PHP.net dice que se utilizan para ejecutar programas externos. ver referencia De los ejemplos que veo, no veo ninguna diferencia obvia.

Si simplemente ejecutara un script (bash o python), ¿qué función me recomienda usar?


Como se extrae de http://php.net/ && Chipmunkninja :

La función del system()

La función del sistema en PHP toma un argumento de cadena con el comando para ejecutarse, así como cualquier argumento que desee que pase a ese comando. Esta función ejecuta el comando especificado y descarga cualquier texto resultante en el flujo de salida (ya sea la salida HTTP en una situación de servidor web o la consola si está ejecutando PHP como herramienta de línea de comandos). El retorno de esta función es la última línea de salida del programa, si emite salida de texto.

La función exec ()

La función del sistema es bastante útil y poderosa, pero uno de los mayores problemas con esto es que todo el texto resultante del programa va directamente al flujo de salida. Habrá situaciones en las que le gustaría formatear el texto resultante y mostrarlo de alguna manera diferente, o no mostrarlo en absoluto.

Para esto, la función exec en PHP está perfectamente adaptada. En lugar de volcar automáticamente todo el texto generado por el programa que se está ejecutando en el flujo de salida, le da la oportunidad de colocar este texto en una matriz devuelta en el segundo parámetro a la función:

La función shell_exec()

La mayoría de los programas que hemos estado ejecutando hasta ahora han sido, más o menos, programas reales1. Sin embargo, el entorno en el que operan los usuarios de Windows y Unix es en realidad mucho más rico que este. Los usuarios de Windows tienen la opción de usar el programa de símbolo del sistema de Windows, cmd.exe. Este programa se conoce como shell de comandos.

La función passthru()

Una función fascinante que PHP proporciona similar a las que hemos visto hasta ahora es la función de paso. Esta función, como las demás, ejecuta el programa que le digas. Sin embargo, luego procede a enviar inmediatamente la salida en bruto de este programa al flujo de salida con el que PHP está trabajando actualmente (es decir, HTTP en un escenario de servidor web o el shell en una versión de línea de comandos de PHP).

La función proc_open() y la función popen()

proc_open () es similar a popen () pero proporciona un grado mucho mayor de control sobre la ejecución del programa. cmd es el comando a ser ejecutado por el shell. descriptorspec es una matriz indexada donde la clave representa el número del descriptor y el valor representa cómo PHP pasará ese descriptor al proceso hijo. las tuberías se establecerán en una matriz indexada de punteros de archivos que corresponden al final de PHP de todas las tuberías que se crean. El valor de retorno es un recurso que representa el proceso; debe liberarlo utilizando proc_close () cuando haya terminado con él.


En realidad, todo depende de cómo desee manejar la salida que podría devolver el comando y si desea que su secuencia de comandos PHP espere a que finalice el programa del destinatario o no.

  • exec ejecuta un comando y pasa la salida a la persona que llama (o lo devuelve en una variable opcional).

  • passthru es similar a la función exec() en que ejecuta un comando. Esta función se debe usar en lugar de exec() o system() cuando la salida del comando Unix son datos binarios que deben pasarse directamente al navegador.

  • system ejecuta un programa externo y muestra la salida, pero solo la última línea.

Si necesita ejecutar un comando y hacer que todos los datos del comando se devuelvan directamente sin ninguna interferencia, use la función passthru() .


La respuesta anterior parecía ser un poco confusa o incompleta, así que aquí hay una tabla de las diferencias ...

+----------------+-----------------+----------------+----------------+ | Command | Displays Output | Can Get Output | Gets Exit Code | +----------------+-----------------+----------------+----------------+ | system() | Yes (as text) | Last line only | Yes | | passthru() | Yes (raw) | No | Yes | | exec() | No | Yes (array) | Yes | | shell_exec() | No | Yes (string) | No | | backticks (``) | No | Yes (string) | No | +----------------+-----------------+----------------+----------------+

  • "Salida de pantallas" significa que transmite la salida al navegador (o la salida de la línea de comandos si se ejecuta desde una línea de comandos).
  • "Puede obtener salida" significa que puede obtener la salida del comando y asignarlo a una variable de PHP.
  • El "código de salida" es un valor especial devuelto por el comando (también denominado "estado de retorno"). Cero usualmente significa que fue exitoso y otros valores generalmente son códigos de error.

Otras cosas misceláneas a tener en cuenta:

  • El shell_exec () y el operador backticks hacen lo mismo.
  • También hay proc_open () y popen () que le permiten leer / escribir secuencias de forma interactiva con un comando de ejecución.
  • Agregue "2> & 1" a la cadena de comando si también desea capturar / mostrar mensajes de error.
  • Use escapeshellcmd () para escapar de los argumentos de comando que pueden contener caracteres problemáticos.
  • Si se pasa una variable $ output a exec () para almacenar la salida, si $ salida no está vacía, se le agregará la nueva salida. Por lo tanto, es posible que primero deba desactivar ($ output).

Si está ejecutando su script PHP desde la línea de comandos, passthru() tiene un gran beneficio. Le permitirá ejecutar scripts / programas como vim , dialog , etc., permitiendo que esos programas manejen el control y regresen a su script solo cuando hayan terminado.

Si usa system() o exec() para ejecutar esos scripts / programas, simplemente no funcionará.

Gotcha: Por alguna razón, no puedes ejecutar less con passthru() en PHP.


Tienen propósitos ligeramente diferentes.

  • exec() es para llamar a un comando del sistema, y ​​quizás tratar con la salida usted mismo.
  • system() es para ejecutar un comando del sistema y mostrar inmediatamente la salida, probablemente texto.
  • passthru() es para ejecutar un comando del sistema del cual desea obtener el retorno sin formato, probablemente de forma binaria.

En cualquier caso, te sugiero que no uses ninguno de ellos. Todos ellos producen código altamente no portátil.