PHP 实现守护进程

14 评论112次阅读2009.12.04 0:06; 作者:Felicia 

很早以前就有用PHP实现守护进程的想法,无奈实验了很多次(包括跟Felix一起做的实验),结果都是关掉浏览器,PHP脚本就停止运行了。

今天无意中找到两个函数,想着或许对实现守护进程有帮助,他们是:

<?php
void set_time_limit(int seconds); //配置页面最长执行时间
void ignore_user_abort(bool setting); //设置是否忽略用户终止操作
?>

我的设想是,把页面最长执行时间设置成0,相当于页面脚本可以无限时运行,并且设置忽略用户终止操作。
测试代码如下

<?php
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分钟,晕,实验还是失败了。

相关文章

  • 评论 (14)
  • 引用通告 (0)
发表评论 引用通告

  • 巫山霏云 | 回复 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

      还是买个能用命令行的虚拟主机好

暂无引用通告