2009-02-19 23 views
15

Estoy tratando de invocar un script que toma 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. La secuencia de comandos se parece a llamar:No se puede ejecutar el script PHP usando PHP exec

exec('/usr/bin/php /home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &'); 

Cuando ejecuto esto, la salida execoutput.txt contiene una copia de la página de guión invocación, no hello world como lo esperaba.

¿Por qué no puedo obtener esta secuencia de comandos PHP para ejecutar utilizando exec? Tenga en cuenta que cuando cambio el comando a algo como ls -l, la salida es una lista de directorios como se esperaba. por cierto, en caso de que importa, yo chmod la llamada secuencia de comandos para 755 ...

actualización - Me moví la llamada exec para el final de la secuencia de comandos que llama y al menos ahora no veo el guión de llamada ejecutado en la salida. Gracias a los carteles y voy a probar algunas de estas ideas.

¡Ayuda!

Gracias Steve

Respuesta

16

Lo Exec está haciendo es tomar el comando de más a la derecha y añadiendo 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 lo que desea la salida de la secuencia de comandos, intente:

exec('/home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &') 

sin embargo, si no desea que los errores sean en el archivo, debe redirigir el STDERR antes de la salida al archivo. De la misma manera:

exec('/home/quote2bi/tmp/helloworld.php 2> /dev/null > /tmp/execoutput.txt') 

lo anterior solo debe dar salida al "Hola mundo" a la salida de la publicación.

Editar:

interesante que está recibiendo este comportamiento. Usted indicó que el comando "ls" funcionó. Trate de hacer un alias para esto y lo remitirá a un archivo de este modo:

alias pexec='php /home/quote2bi/tmp/helloworld.php'

continuación

exec('pexec > /tmp/execoutput.txt 2>&1 &') 

parece ser un problema con la forma ejecutivo maneja la entrada en contraposición a la propia cáscara .

-John

+1

John - gracias por su respuesta, pero lamentablemente, no funcionó para mí. Cuando lo intenté: exec ('/ home/quote2bi/tmp/helloworld.php> /tmp/execoutput.txt 2> & 1 &') ... Obtuve los mismos resultados (página actual en el archivo de salida). El segundo ejecutivo bloqueado (omitiendo el &) - cuando se agregó obtuve los mismos resultados. –

+0

¿Hay alguna opción si la función exec() está deshabilitada en mi servidor? –

7

El problema es con el propio PHP, se trata todo como $ argv en el guión. No redirige la salida a un archivo ou a/dev/null.

Hace un tiempo tuve el mismo problema. 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') 

Está la única manera que logró conseguir este trabajo.

0

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, entonces por qué no escribir el script de shell y luego ejecutarlo (y, por supuesto, limpiar después)?

28

Tuve este problema también y resulta que esto 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. Por lo que aún puede utilizar exec, pero en lugar de utilizar php php-cli al llamar en el navegador de su uso:

exec("php-cli somescript.php"); 

Esto funcionó para mí.

+1

Esto también me funcionó. Ojalá hubiera visto esta respuesta antes, habría resuelto un dolor de cabeza de 5 horas. – Omar

+1

Usted señor acaba de salvar mi día. Esta es la respuesta correcta. – DataHerder

+1

He estado buscando esto por HORAS y estaba a punto de darme por vencido. Tenga en cuenta que si está utilizando PHPSuEXEC, esto no parece ser necesario, pero tan pronto como desactive suexec, debe usar php-cli como se especifica. – rinogo

1

si está simplemente ejecutando un script php una posible manera de ejecutar el código completo es utilizar el include() que se ejecutará el archivo php y salida de ningún resultado. No se puede dirigir la salida a un archivo de texto, sino que debe aparecer en la ventana del navegador si estás script php Hello World parece

<?php echo "Hello World!"; ?> 

entonces será escupir que en el navegador. Por lo que su segundo código se vería así

<?php include("helloWorld.php"); echo " PHP ROCKS";?> 

lo que resulta en una página que se vería así,

¡Hola mundo! PHP ROCKS

0

Esto se ejecuta 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>) 

Hope this helps !!