0

我有一个作为守护进程运行的 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.

如果我直接从目录内部执行 daemon.php php daemon.php,则不会发生这种情况,并且一切都按预期工作。

非常反常的行为。如何设置它以使 cron 作业的效果与直接从其目录内执行脚本时的效果完全相同?

4

1 回答 1

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);
}

?>
于 2012-04-08T15:28:43.303 回答