用PHP写daemon的问题

2014-01-13 14:59:54 +08:00
 bearcat001
比如下面这样一个文件test.php
<?php
echo exec("nohup sleep 20 > /dev/null 2>&1 & echo $!");
?>

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

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

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