代码之家  ›  专栏  ›  技术社区  ›  Jrgns

用php编写的守护进程的可行性如何,使用ignore_user abort和set_time_limit(0)

  •  2
  • Jrgns  · 技术社区  · 15 年前

    我正在研究守护进程,并想知道使用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);
    

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

    我已经在我的笔记本电脑上运行了7个小时了,这个脚本看起来不错,但作用不大。还有人试过这个吗?

    3 回复  |  直到 12 年前
        1
  •  3
  •   Alister Bulman    12 年前

    我倾向于将循环放入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 .

        2
  •  1
  •   Robert Munteanu    15 年前

    我建议不要这样做。

    4年前有一个漏洞 Memory allocated for objects created in object methods is not released .

    开发人员认为这是 特征请求 但在使用长时间运行的流程时,很难解决这个问题。我试着去做了,但当我能够退休的时候,我感到非常欣慰。

        3
  •  0
  •   anon    14 年前

    Sonic服务器守护进程可能也值得检查。

    http://dev.pedemont.com/sonic