使用ignore_user abort和set_time_limit(0)用PHP编写的守护进程是否可行

时间:2009-06-17 13:06:50

标签: php daemon

我正在捣乱守护进程,并想知道使用PHP执行此操作是否可行(在内存和CPU使用方面以及可靠性方面):

<?php
// Ignore user aborts and allow the script
// to run forever
ignore_user_abort(true);
set_time_limit(0);

$fp = fopen('loop.log', 'w');
fwrite($fp, date('Y-m-d H:i:s') . ' Started' . PHP_EOL);
while(1) {
    fwrite($fp, date('Y-m-d H:i:s') . ' Looped' . PHP_EOL);
    if (file_exists('loop.stop')) {
        break;
    }
    // Sleep for 100 seconds
    sleep(100);
}
fwrite($fp, date('Y-m-d H:i:s') . ' Stopped' . PHP_EOL);
fclose($fp);

这个简单的例子(改编自ignore_user_abort的PHP手册)只是容器脚本。实际功能将放在while循环中。

我已经在我的笔记本电脑上运行了这个脚本7个小时了,它看起来很好,但它并没有做太多。还有其他人试过吗?

3 个答案:

答案 0 :(得分:3)

我倾向于将循环放入BASH脚本中,以便定期清理所有PHP资源。

#!/bin/bash
clear
date

php -f doChecksAndAct.php
sleep 100
# rerun myself
exec $0

如果您在PHP脚本中执行任何特别重的设置任务,您还可以在其中放置一个小(ish)循环(例如50-100次迭代,如果它们之间没有暂停多秒)减少运行之间的总开销时间。

添加:我在Bash / PHP(或其他语言)配对上发表博客,以便您可以非常轻松地在PHP脚本中循环,然后立即退出重启,或暂停一段时间 - Doing the work elsewhere -- Sidebar running the worker

答案 1 :(得分:1)

我建议反对。

4年前有一个错误打开Memory allocated for objects created in object methods is not released

开发人员认为这是功能请求,但在使用长时间运行的进程时,很难解决它。当我能够退出申请时,我尽力但非常放心。

答案 2 :(得分:0)

声音服务器守护程序可能值得一试

http://dev.pedemont.com/sonic