从php启动一个独立的进程(通过httpd)

时间:2010-08-30 13:51:30

标签: php linux bash unix daemon

我正在尝试在unix环境中从php生成一个类似守护进程的进程,保持pid以供参考并使其完全独立于httpd进程。这对于从管理后台控制中间件应用程序非常有用。我希望将它概括为可以重用于任何命令,我不想为每个命令编写.sh。

使用php的exec()我正在运行此命令:

$command = "java /myApp/TestInfiniteLoop";
$log = "/myApp/myLog.txt";
$echos = null;
$fullCommand = "bash -c 'nohup $command < /dev/null > $log 2>&1 & echo $! & exit' & echo $!";
exec($fullCommand, $echos);
$pid = (int)$echos[0] + 2;

它返回$ pid但不会产生进程(或立即杀死它......)。

如果我在bash shell上运行$ fullCommand,它可以完美运行。我可以关闭bash,一切都按预期运行。

如果我取出“nohup”它可行(但是pid是+ 1而不是+2),但是一旦你停止httpd,这个过程就会被杀死......

  1. 使其正常工作的正确方法是什么?

  2. 如果有可能,任何人都可以纠正它直接获得pid?我假设它是来自bash(+2)调用的第二个进程,但它可能(虽然不太可能,我知道......)它不会是相同的。

  3. PS:我一直在Mac和Linux环境中测试它。

3 个答案:

答案 0 :(得分:1)

你几乎拥有它。我想你可能有太多的管道正在进行,http进程没有断开连接,因为它正在等待输出。这将有效:

$command = 'java /myApp/TestInfiniteLoop';
exec('nohup '.$command.' >> /myApp/myLog.txt 2>&1 & echo $!', $pid);
$pid = (int)$pid[0];

我一直使用PHP脚本执行此操作,您不必编写shell脚本。

答案 1 :(得分:0)

我过去做过的一件事就是有一个单独的进程(如python或c应用程序)已经运行,可以监视文本文件或数据库。 php进程要么写入文件或数据库,而另一个进程作为具有单独权限的单独用户运行,则轮询该文件或数据库。当它看到它正在寻找的东西时,它会做任何需要的事情,将进度报告回文件或数据库。这样你就可以在应用程序中有更多的自由和灵活性(例如,它可以将其pid写入文件,以便php知道它是什么)。

答案 2 :(得分:0)

我会研究类似gearman api的东西,它旨在创建长时间运行的进程(然后从中生成动作)而不是尝试自己生成应用程序并尝试找出pid (它将有更多跨平台的好处)。 +2 pid肯定会出现竞争条件问题。