在后台运行PHP脚本

时间:2014-03-28 09:52:10

标签: php command-line-interface

我有这个简单的示例脚本:

#!/usr/bin/php

<?php

while(true) {
   error_log("hello " . time() . "\n", 3, "logs.log");
   sleep(3);
}

我使用命令执行:

me:~/Desktop$ php worker.php &

正如预期的那样,它会返回6683:进程的ID。精细。

现在为了确保一切正常我做ps并获得:

PID TTY          TIME CMD
5561 pts/1    00:00:00 bash
6683 pts/1    00:00:00 php
6705 pts/1    00:00:00 ps

[1]+  Stopped                 php worker.php

为什么停止了?它是不是应该连续运行直到某人kill -9呢?

如果我再做一次ps,我会得到:

PID TTY          TIME CMD
5561 pts/1    00:00:00 bash
6683 pts/1    00:00:00 php
7395 pts/1    00:00:00 ps

该过程在那里,但它没有记录(休眠?)

任何?

TA

2 个答案:

答案 0 :(得分:1)

不确定我的推理是否正确,但我也遇到了这个问题,并使用nohup解决了这个问题。

我的理由是这样的:
PHP进程具有stdin的句柄。通过在后台运行进程,您无法从stdin读取,也许在某些时候可能会发送挂断信号。
通过使用nohup,您可以忽略该信号。

关于此事

Here's a few extra words of explanation

答案 1 :(得分:1)

脚本必须有转储stdout的位置,否则它会显示上述行为(停止)。这可以这样做:

php worker.php > /dev/null &

像这样它可以工作,定时的infinte循环可以完成它的工作。唯一的问题是:如果你现在停止父进程(shell),那么后台php进程也会停止。

要绕过它,请运行:

disown -h php-process-id

Youi现在可以关闭所有炮弹,退出并前往酒吧。

干得好! ;)