php - example - shell_exec not working
No se puede ejecutar el script PHP usando PHP exec (6)
El problema es con PHP en sí mismo, trata todo como $ argv en el script. No redirige la salida a un archivo ou a / dev / null.
Me enfrenté al mismo problema hace algún tiempo. Lo que hice fue crear un runscript.php
en / opt / php-bin y luego dentro de este script ejecutar lo que debería estar ejecutándose. Algo como esto:
$script = $argv[1]
$params = implode('' '', array_slice($argv, 2));
$cmd = "{$script} {$params} > /dev/null &";
$output = array();
$return = 0;
exec("php {$cmd}", $output, $return);
exit((int)$return);
Y luego lo llamas usando:
exec(''/opt/php-bin/runscript.php /path/to/your/script.php arg1 arg2'')
Es la única forma en que logré que esto funcione.
Intento invocar un script que demora varios segundos (servicios web con terceros) usando la llamada de PHP Exec. Después de mucho luchar, reduje esto al clásico ejemplo de hello world. El script de llamada se ve así:
exec(''/usr/bin/php /home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &'');
Cuando ejecuto esto, el resultado execoutput.txt
contiene una copia de la página de script de invocación, no hello world
como esperaba.
¿Por qué no puedo obtener este script PHP para ejecutar usando exec? Tenga en cuenta que cuando cambio el comando a algo como ls -l
, el resultado es una lista de directorios como se esperaba. Por cierto, en caso de que importe, hice chmod el script llamado a 755 ...
Actualización : moví la llamada del ejecutivo al final del script de llamada y al menos ahora no veo el script de llamada ejecutado en el resultado. Gracias a los carteles y voy a probar algunas de estas ideas.
¡Ayuda!
Gracias Steve
Lo que hace el ejecutivo es tomar el comando más a la derecha y anexarlo a su destino. Si tiene la línea shebang en su script php, no debería necesitar incluir la directiva binaria del intérprete php.
si solo quieres el resultado del script, prueba:
exec(''/home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &'')
Sin embargo, si no desea que los errores estén en el archivo, debe redireccionar el STDERR antes de enviarlo al archivo. Al igual que:
exec(''/home/quote2bi/tmp/helloworld.php 2> /dev/null > /tmp/execoutput.txt'')
lo anterior solo debería generar el "Hola mundo" a la salida de la ejecutiva.
Editar:
Es interesante que estés obteniendo este comportamiento. Usted indicó que el comando "ls" funcionó. Intenta hacer un alias para esto y reenvíalo a un archivo así:
alias pexec=''php /home/quote2bi/tmp/helloworld.php''
entonces
exec(''pexec > /tmp/execoutput.txt 2>&1 &'')
parece ser un problema con la forma en que exec maneja la entrada en oposición a la propia shell.
-John
Para evitar los problemas declarados de PHP en esta área, ¿por qué no poner esto dentro de un script de shell? PHP puede ejecutar el script de shell que tiene todas las redirecciones manejadas internamente.
Si necesita cambiar dinámicamente las cosas, ¿por qué no escribir el script de shell y luego ejecutarlo (y, por supuesto, limpiarlo después)?
Tuve este problema también y resulta que es un error en php (# 11430). La solución es utilizar php-cli cuando se llama a otro script php dentro de un script php. De modo que aún puede usar exec pero en lugar de usar php use php-cli cuando lo llama en el navegador:
exec("php-cli somescript.php");
Esto funcionó para mí.
Si simplemente ejecuta un script php, una forma posible de ejecutar el código completo es utilizar include () que ejecutará el archivo php y generará resultados. No puede dirigir la salida a un archivo de texto, pero debería aparecer en la ventana del navegador si su script Hello World php se parece a
<?php echo "Hello World!"; ?>
luego escupirá eso en el navegador. Entonces su segundo código se vería como
<?php include("helloWorld.php"); echo " PHP ROCKS";?>
dando como resultado una página que se vería así,
¡Hola Mundo! ROCAS DE PHP
Esto funciona como si ejecutara el script desde el navegador.
Esto apareció mientras trabajaba en un proyecto en la plataforma de Linux.
exec(''wget http://<url to the php script>)
¡¡Espero que esto ayude!!