2011-03-13 3 views
6

J'essaie d'exécuter les processus php en arrière-plan et de lancer ceci à partir d'un fichier php.nohup: exécute le processus PHP en arrière-plan

Quelques informations: PHP Version 5.2.17, php safe_mode est désactivé, système linux. Je démarre le processus avec exec, j'ai déjà essayé shell_exec. Je mets tous les fichiers à 0755, 0777.

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

Si j'imprimer cette déclaration, je reçois cela et le pid est correct:

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

Si je regarde les processus sous ssh avec

top 

Je vois mon processus php5 avec le bon pid. l'utilisateur est 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 je commence la partie supérieure du manuel de processus ressemble à ceci:

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 

Le problème: il semble que rien happens.To déboguer un peu i a écrit une sortie en le fichier

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

Aucun journal dans mon fichier. Si je démarre ce fichier dans mon navigateur, il traite correctement et récupère mon fichier file.log avec les informations de "débogage".

Pourquoi cela fonctionne dans le navigateur et non sur la commande exec/shell_exec ??! J'ai exactement ces processus PHP avec pid correct, mais aucun résultat.

Merci beaucoup pour votre aide!

+0

Vous devez d'abord essayer de fournir un chemin absolu au script que vous essayez d'exécuter, et non un chemin relatif comme vous semblez le faire maintenant. C'est à dire. utilisez 'nohup/usr/local/bin/php5 /absolute/chemin/vers/fichier.php>/dev/null 2>/dev/null & echo $!' – wimvds

+0

J'ai le chemin absolu vers ce fichier. Je peux commencer ce nohup de chaque répertoire dans ssh. ça marche. malheureusement pas avec php. – stoe

+0

Ensuite, cela pourrait être un problème d'autorisation. Vérifiez donc vos journaux (Apache, journal des erreurs php, journal de la console) ... Si vous exécutez AppArmor/SELinux, essayez de le désactiver pour tester si vous devez modifier votre politique de sécurité pour autoriser ces tâches en arrière-plan. – wimvds

Répondre

1

L'environnement PHP CLI peut être différent de l'environnement Web (mod_php, FCGI, peu importe). Il est tout à fait possible qu'un script meure avec une erreur lorsqu'il est exécuté à partir de la ligne de commande et non lorsque vous l'invoquez via un serveur Web. Déboguez votre script. Si vous le pouvez, SSH dans votre serveur, su à l'utilisateur du serveur Web et exécutez le script à partir de la ligne de commande vous-même.

Si vous ne pouvez pas faire cela, configurez votre propre serveur de développement où vous pouvez le faire (ce n'est pas si difficile si vous connaissez un peu de Linux).

Questions connexes