2011-03-13 32 views
6

intento ejecutar procesos de php en segundo plano e iniciarlo desde un archivo php.nohup: ejecutar el proceso de PHP en segundo plano

Algunas informaciones: PHP Versión 5.2.17, php safe_mode está desactivado, sistema de Linux. Comienzo el proceso con el ejecutivo, intenté ya con el shell_exec. Me puse todos los archivos a 0755, 0777.

$pid = exec("nohup $cmd > /dev/null 2> /dev/null & echo $!"); 

Si i imprimir esta declaración, me sale este y el PID está bien:

nohup /usr/local/bin/php5 /.../../file.php > /dev/null 2> /dev/null & echo $! 

si miro en procesos bajo ssh con

top 

veo mi proceso php5 con el pid correcto. usuario es root

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND                      
3533 xxxxxxxx 20 0 21356 8868 4580 S 0 0.4 0:00.13 php5                       
3536 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5                       
3539 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5                       
3542 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5                       
3545 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5                       
3548 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5                       
3551 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5  

si comienzo a la parte superior manual de proceso es el siguiente:

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
8141 xxxxxxxx 22 2 24048 9.9m 5344 S 10 0.5 0:00.31 php5 

El problema: parece que nada happens.To depurar un poco i escribió una salida en el archivo

ob_start(); 
echo "STARTING..."; 
writeLog(ob_get_contents()); 
//... 
function writeLog($info){ 
    $handle = fopen("file.log", "a+"); 
    fwrite($handle, $info); 
    fclose($handle); 
} 
exit; 

No hay registros en mi archivo. Si inicio este archivo en mi navegador, se procesa correctamente y obtengo mi file.log con la información de "depuración".

¿Por qué esto funciona en el navegador y no en el comando exec/shell_exec ??! Tengo exactamente estos procesos php con pid correcto, pero no hay resultado.

¡Muchas gracias por la ayuda!

+0

Primero debe intentar proporcionar una ruta de acceso absoluta al script que está intentando ejecutar, no uno relativo como el que parece estar haciendo ahora. Es decir. use 'nohup/usr/local/bin/php5 /absolute/path/to/file.php>/dev/null 2>/dev/null & echo $!' – wimvds

+0

Tengo la ruta absoluta a este archivo. Puedo comenzar este nohup desde cada directorio en ssh. esta funcionando. desafortunadamente no con php. – stoe

+0

Entonces podría ser un problema de permiso. Así que revise sus registros (Apache, registro de errores php, registro de la consola) ... Si está ejecutando AppArmor/SELinux intente apagarlo para probar si necesita cambiar su política de seguridad para permitir estas tareas en segundo plano. – wimvds

Respuesta

1

El entorno CLI de PHP puede ser diferente del entorno web (mod_php, FCGI, lo que sea). Es completamente posible que un script muera con un error cuando se ejecuta desde la línea de comandos y no cuando lo invocas a través de un servidor web. Depure su script Si puede, SSH en su servidor, su al usuario del servidor web y ejecute el script desde la línea de comandos usted mismo.

Si no puedes hacer eso, configura tu propio servidor de desarrollo donde puedes hacer esto (no es tan difícil si conoces algo de Linux).

Cuestiones relacionadas