我有一个PHP脚本,它作为守护进程运行。一次运行8个线程。
为了确保8个线程始终在运行,以下PHP脚本从cron运行,它与daemon.php脚本位于同一目录中:
<?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);
}
}
?>
以上将很乐意运行daemon.php脚本,但之后发生了一些奇怪的事情,并且daemon.php脚本本身有时会认为它位于不同的目录中,而不是其他时间。具体来说,我使用了很多exec
函数来执行其他应用程序,其中许多(但不是全部)都认为它们回到原始目录而不是/root/fb
。
如果我从目录中直接用php daemon.php
执行daemon.php,那么这不会发生,一切都按预期工作。
非常偏离行为。如何设置它以使cron作业的效果与直接从其目录中执行脚本时的效果完全相同?
答案 0 :(得分:0)
也许简化和更具防御性的编程方法可以帮助您缩小问题范围。
<?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);
}
?>