2012-04-08 11 views
0

Ich habe ein PHP-Skript, das als Daemon ausgeführt wird. 8 Threads laufen gleichzeitig.PHP & Cron - chdir funktioniert nicht

Um sicherzustellen, 8 Threads immer ausgeführt werden, wird die folgende PHP-Skript von cron, die als daemon.php Skript im selben Verzeichnis ist:

<?php 

chdir('/root/fb'); 
if (file_exists('pause')) die(); 

exec('ps ax | grep -v grep | grep daemon.php',$output); 
$output=implode("\n",$output); 
$num=8-substr_count($output,'daemon.php'); 
if ($num>0) 
{ 
for($run=0; $run<$num; $run++) 
    { 
    exec('php daemon.php > /dev/null 2>&1 &'); 
    sleep(20); 
    } 
} 

?> 

über die die daemon.php glücklich laufen Skript, aber dann passiert etwas seltsames, und das daemon.php Skript selbst wird denken, dass es manchmal in einem anderen Verzeichnis ist und nicht in anderen Zeiten. Insbesondere verwende ich viele der exec Funktion, um andere Anwendungen auszuführen, und viele von diesen (aber nicht alle) denken, sie sind wieder im ursprünglichen Verzeichnis und nicht in /root/fb.

Wenn ich daemon.php direkt mit php daemon.php aus dem Verzeichnis ausführen, dann tritt dies nicht auf und alles funktioniert wie vorgesehen.

Sehr schlechtes Verhalten. Wie kann ich es so einstellen, dass der Effekt vom Cron-Job genau gleich ist, wenn das Skript direkt aus seinem Verzeichnis heraus ausgeführt wird?

Antwort

0

Vielleicht hilft Ihnen die Vereinfachung und ein defensiverer Programmieransatz, das Problem einzugrenzen.

<?php 

if (!chdir('/root/fb')) die("couldn't chdir"); 
file_exists('pause')) die("paused"); 

exec('pgrep -f "php daemon.php"',$output); 
$output = implode("\n",$output); 
$num = 8 - count($output); 
for($run = 0; $run < $num; $run++) { 
    /*exec('php daemon.php > /dev/null 2>&1 &');*/ 
    passthru('echo $PWD'); 
    sleep(20); 
} 

?>