PHP 实现守护进程
14 评论112次阅读2009.12.04 0:06; 作者:Felicia
很早以前就有用PHP实现守护进程的想法,无奈实验了很多次(包括跟Felix一起做的实验),结果都是关掉浏览器,PHP脚本就停止运行了。
今天无意中找到两个函数,想着或许对实现守护进程有帮助,他们是:
void set_time_limit(int seconds); //配置页面最长执行时间
void ignore_user_abort(bool setting); //设置是否忽略用户终止操作
我的设想是,把页面最长执行时间设置成0,相当于页面脚本可以无限时运行,并且设置忽略用户终止操作。
测试代码如下
set_time_limit(0);
ignore_user_abort(true);
while (true) {
$fp = fopen('test.txt', 'a');
fwrite($fp, date("Y-m-d H:i:s")."\n");
fclose($fp);
sleep(1);
}
在本机win7和meyu服务器(linux),都测试通过了,test.txt在用户关闭浏览器之后仍然不断增长。
到现在为止在服务器上脚本运行了14分钟(在浏览器关闭之后,用ftp查看test.txt),仍然在继续增长,说明测试进程仍然在执行。
至此,可以证明PHP能够实现守护进程了。
早上起来发现测试进程停止了……一共执行了20分钟,晕,实验还是失败了。
发表回复

巫山霏云 | 1F
十二月 5th, 2009 at 01:31
这个,你可以用命令行来执行,对于web这种方法,除了php自身的控制外,估计还有apache的控制,所以还是放弃吧
如果非要通过web启动的话,是不是可以在php脚本里面调用shell来执行一个deamon呢
Felicia | 2F
十二月 5th, 2009 at 20:44
问题是,你也知道meyu不让你搞shell这种事吧
boluor | 3F
十二月 5th, 2009 at 10:35
这种方式除非apache有限制,不然不会20分钟就结束了吧。我在本机上测试,已经跑了2个小时了。按照每行20Byte计算,我看结果中每秒都是打印两遍,这样的话一个小时文件也就140KB左右。
Felicia | 4F
十二月 5th, 2009 at 20:42
我就是想在服务器上维持一个进程,然后在数据库中维护一个消息表,该进程负责定时读取消息表,处理新的消息。别的程序可以通过在消息表中插入新的消息和他通信。
怎样能突破apache的限制,长时间运行一个程序呢?
boluor | 5F
十二月 6th, 2009 at 20:59
在我现在的主机上,执行了相当长时间也没有结束阿。而且,如果sleep时间稍微长点,比如sleep(4)的话,cpu占用率也不会引起管理员注意。我用sleep(1)的时候,小张说,虽然服务器负载高了点,不过还在正常范围内。
我现在也不清楚到底怎么回事。apache配置文件中没找到相关的限制,应该不关apache啥事。
ps:
我测试用的主机是FastCGI模式的。
Felicia | 6F
十二月 6th, 2009 at 21:27
貌似你的空间挺不错的,我考虑把博客转到那边去吧。这样我就能乱搞了
boluor 7F
十二月 6th, 2009 at 21:39
shell也是不让执行的,不过其他确实不错。我现在一个缓存插件都没用上。速度已经够快了。
Felicia 8F
十二月 6th, 2009 at 21:41
晕,貌似到5级评论限制了,我不能回复你的评论……
WindyWinter | 9F
十二月 5th, 2009 at 21:11
apache似乎没有这样的限制项,而且现在专业的虚拟主机大多已经不是用apache handler处理php了,而是用fast-cgi模式。linux有一个ulimit,可以限制进程的cpu时间,我觉得可能是对应的php-cgi进程触发了这个限制。
Felicia | 10F
十二月 6th, 2009 at 08:51
那么怎样突破这个限制呢?
felix021 | 11F
十二月 7th, 2009 at 17:34
前些天我才搞过这个实验=。= 但是这个脚本在几个小时后还是停掉了,不知道为什么。
但是我们可以测试出停掉的时间,然后再停掉之前重新访问一次。
felix021 | 12F
十二月 7th, 2009 at 17:36
最初是加菲跟我提起这个问题的,可以看看他这篇日志:
http://www.xayljq.com.cn/blog/read.php?33
Felicia | 13F
十二月 10th, 2009 at 23:35
还是买个能用命令行的虚拟主机好
felix021 | 14F
十二月 17th, 2009 at 19:18
买VPS吧=。=