2

我正在处理守护进程,并想知道使用 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 个小时,它看起来很好,但它并没有做太多。有没有其他人试过这个?

4

3 回答 3

3

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

#!/bin/bash
clear
date

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

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

补充:我写过关于 Bash/PHP(或其他语言)配对的博客,这样您就可以非常轻松地循环进入 PHP 脚本,然后退出以立即重新启动,或者暂停一段时间 -在其他地方进行工作 - 边栏运行工人

于 2009-06-17T18:20:00.423 回答
1

我建议反对。

4 年前有一个错误打开,它说为对象方法中创建的对象分配的内存未释放

开发人员认为这是一个功能请求,但在使用长时间运行的进程时很难解决它。我尝试过,但当我能够退出应用程序时,我感到非常欣慰。

于 2009-06-17T13:18:59.463 回答
0

sonic 服务器守护进程可能也值得一试

http://dev.pedemont.com/sonic

于 2010-02-23T21:40:05.927 回答