繁体   English   中英

在后台运行php脚本

[英]Running php script in the background

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

#!/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

该过程已存在,但未记录日志(休眠?)

任何人?

该脚本必须有一个转储标准输出的地方,否则它会显示上述行为(停止运行)。 可以这样完成:

php worker.php > /dev/null &

这样,它就可以工作了,定时无限循环完成了它的工作。 唯一的问题是:如果您现在停止父进程(外壳程序),则后台php进程也将停止。

要解决它,请运行:

disown -h php-process-id

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

干得好! ;)

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

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

这是对此事的一些补充说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM