PHP exec() vs sistema() vs passthru()
¿Cuáles son las diferencias?
¿Existe una situación o motivo específico para cada función? En caso afirmativo, ¿puede darnos 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 recomendaría usar?
Tienen propósitos ligeramente diferentes.
exec()
es para llamar a un comando del sistema y tal vez manejar el resultado usted mismo.system()
es para ejecutar un comando del sistema y mostrar inmediatamente el resultado, presumiblemente texto.passthru()
es para ejecutar un comando del sistema del cual desea obtener el retorno sin formato, presumiblemente algo binario.
De todos modos, le sugiero que no utilice ninguno de ellos. Todos ellos producen código altamente no portátil.
Todas las respuestas anteriores parecen un poco confusas o incompletas, 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 |
+----------------+-----------------+----------------+----------------+
- "Muestra salida" significa que transmite la salida al navegador (o la salida de la línea de comando si se ejecuta desde una línea de comando).
- "Puede obtener salida" significa que puede obtener la salida del comando y asignarla a una variable PHP.
- El "código de salida" es un valor especial devuelto por el comando (también llamado "estado de retorno"). Cero normalmente significa que fue exitoso, otros valores suelen ser códigos de error.
Otras cosas varias a tener en cuenta:
- El operador shell_exec() y las comillas invertidas 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.
- Utilice escapeshellcmd() para escapar de los argumentos del comando que pueden contener caracteres problemáticos.
- Si pasa una variable $output a exec() para almacenar la salida, si $output no está vacía, le agregará la nueva salida. Por lo tanto, es posible que primero deba desarmar ($output).
Extraído de http://php.net/ && Chipmunkninja :
La función sistema()
La función del sistema en PHP toma un argumento de cadena con el comando a ejecutar, así como cualquier argumento que desee pasar a ese comando. Esta función ejecuta el comando especificado y vuelca 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 ejecutiva()
La función del sistema es bastante útil y potente, pero uno de sus mayores problemas es que todo el texto resultante del programa va directamente al flujo de salida. Habrá situaciones en las que querrás formatear el texto resultante y mostrarlo de alguna manera diferente, o no mostrarlo en absoluto.
Para ello, la función exec en PHP está perfectamente adaptada. En lugar de volcar automáticamente todo el texto generado por el programa que se ejecuta en el flujo de salida, le brinda la oportunidad de colocar este texto en una matriz devuelta en el segundo parámetro de 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 esto. Los usuarios de Windows tienen la opción de utilizar 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 proporciona PHP similar a las que hemos visto hasta ahora es la función passthru. Esta función, como las demás, ejecuta el programa que usted le indica. Sin embargo, luego procede a enviar inmediatamente la salida sin procesar 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 que ejecutará 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 cualquier tubería que se cree. El valor de retorno es un recurso que representa el proceso; debes liberarlo usando proc_close() cuando hayas terminado con él.