用PHP写daemon的问题

2014 年 1 月 13 日
 bearcat001
比如下面这样一个文件test.php
<?php
echo exec("nohup sleep 20 > /dev/null 2>&1 & echo $!");
?>

在终端下执行php test.php可以将进程留在后台
但是通过浏览器访问test.php的时候,不能在后台留下进程

猜测可能是web进程中止同时把sleep也给中止了,要想一直留着,有什么好的解决方法吗?
4528 次点击
所在节点    PHP
15 条回复
cdffh
2014 年 1 月 13 日
用 setsid 试试?
skydiver
2014 年 1 月 13 日
楼主这种用法本来就是不对的,放弃吧。
shiny
2014 年 1 月 13 日
1、用 ignore_user_abort 可以让用户中断连接的时候避免进程退出
2、再需要设置 set_time_limit(0) 来避免超时的中断

ucenter 的计划任务就是这么做的吧。
breeswish
2014 年 1 月 13 日
想要用作daemon,就用php-cli,并且关闭运行时间限制,不要用php-fpm或者mod-php
h2ero
2014 年 1 月 13 日
如果用的FastCGI可以用`fastcgi_finish_request();`
bearcat001
2014 年 1 月 13 日
@cdffh 应该也是不行的
bearcat001
2014 年 1 月 13 日
@skydiver 恩,还是在cli下写daemon吧
bearcat001
2014 年 1 月 13 日
@shiny 如果是服务端启动一个耗时任务呢?这个任务写的时候就是CLI下运行,因为时长问题
bearcat001
2014 年 1 月 13 日
@breeswish 恩,打算换了,多谢
bearcat001
2014 年 1 月 13 日
@h2ero 多谢
fastcgi_finish_request和ignore_user_abort类似都是继续执行当前脚本,没有办法让exec启动的cli命令驻留下来
jasontse
2014 年 1 月 13 日
@bearcat001 如果是耗时任务就应该向daemon推送队列异步处理。
bearcat001
2014 年 1 月 13 日
@jasontse 恩,打算这么做了,多谢~
picasso250
2014 年 1 月 14 日
php-resque
judasnow
2014 年 1 月 14 日
要是我 就定时执行一段 php 脚本(用crontab或者whatever)然后用redis模拟保存全局变量(每次脚本执行的时候 就从redis读取信息初始化 完成之后保存之)
jevonszmx
2015 年 4 月 24 日
如果你没服务器的权限,仅开发权限的话,就写php脚本,用crontab定时执行;

如果你有服务器权限,可以给php编译一个PCNTL模块,官方文档在这里: http://php.net/manual/zh/book.pcntl.php,可以启动一个deamon在后台,比如有个大队列数据需要一直需要php同步入库,可以fork一个进程一直在后台跑,比crontab频率高,还可以多进程。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/96808

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX