9

保持 PHP 脚本作为守护程序运行的最佳方法是什么,以及检查是否需要重新启动的最佳方法是什么。

我有一些脚本需要 24/7 全天候运行,并且在大多数情况下我可以使用nohup运行它们。但是,如果它们出现故障,那么监控它以便自动重启的最佳方法是什么?

4

9 回答 9

4

如果您不能使用(正确的)init 结构来执行此操作(您在共享主机上等),请每隔几分钟使用 cron 运行一个脚本(可以用您喜欢的任何语言编写),检查查看它们是否正在运行,并在必要时重新启动它们。

于 2008-09-01T23:26:35.400 回答
4

最优雅的解决方案是reactPHP

于 2012-04-28T07:17:14.120 回答
3

快速而肮脏的 cron 来重新启动你的守护进程:

* * * * * USER ps auxww | grep SCRIPTNAME > /dev/null || SCRIPTNAME

将 USER 替换为守护程序运行的用户,并将 SCRIPTNAME 替换为您的脚本名称。把这个贴在/etc/cron.d/restart_php_daemon. 它应该每分钟运行一次。将第一个更改**/2*/5降低运行频率。

更新

如果你把它放到你自己的 crontab 中:

运行crontab -e并添加:

* * * * * ps auxwww | grep SCRIPTNAME > /dev/null || SCRIPTNAME
于 2008-09-02T14:10:13.717 回答
3

我们通过管道输出到邮件来运行我们的守护进程。

php daemon.php | mail -s "daemon stopped" foo@example.org

这样,当/如果守护程序停止时,它将发送一封邮件,并且我们会以这种方式收到通知。

当然,这仍然意味着手动重启守护进程,但我们马上就会知道。通常,如果守护进程停止,则意味着无论如何还有其他事情需要处理,所以通常没问题。

于 2008-09-21T11:14:50.067 回答
1

我已经成功运行 wget 并将结果发送到共享服务器上的 /dev/null 。

于 2008-09-02T02:28:05.980 回答
1

Daemon是一个后台运行的linux进程;apache 或 mysql 是守护进程。在 linux 环境下,我们可以使用 cronjob 运行后台程序,但是它有一些限制,在某些场景下这不是一个好主意。例如,使用 cronjob,我们无法控制之前的运行是否已经完成。因此,将进程作为守护进程运行通常更方便。

// Daemonize
$pid = pcntl_fork(); // parent gets the child PID and child gets 0
if($pid){ // if pid is not 0
     // Only the parent will know the PID. Kids aren't self-aware
     // Parent says goodbye!
     print "Parent : " . getmypid() . " exiting\n";
     exit();
}
print "Child : " . getmypid() . "\n";

上面的代码取自关于如何在 php 中创建守护进程的非常好的文章。您可以在链接中阅读此内容

于 2014-03-06T23:27:38.683 回答
0

我使用基于 PHP 的脚本从数据库中读取数据并发送电子邮件(使用 PEAR Mail_Queue 库)。我从 bash 脚本中运行它,并根据返回的结果(来自“exit $status;”)停止、休眠 X 秒或立即重新启动。(我还在 PHP 脚本中检查了平均负载/睡眠,以避免给邮件系统带来压力)。

如果它是一个必须持续运行的长期守护程序,那么我同意,运行它可能不是最好的事情(尽管我听说过一些确实长期成功运行的套接字服务器),但是, PHP 5.3 现在也改进了垃圾收集,如果脚本写得足够好,不会意外退出,那么内存问题应该比以前少得多。

于 2008-09-21T00:17:54.403 回答
0

我同意 PHP 不是最好的工具,但是我可以理解您为什么要使用 PHP,以便您可以重用应用程序中的组件,例如数据库访问等。

我遇到了类似的问题,我最终开发了 Fat Controller,它是一个用 C 语言编写的可以运行 PHP 脚本的守护进程。它还可以作为多线程守护程序运行,并行运行脚本的许多实例。

这里有更多信息和用例: http ://www.4pmp.com/fatcontroller/

于 2011-02-07T08:55:49.593 回答
-1

TBH,PHP 可能不是最好的工具,实际上不是它的设计目的。当您尝试此操作时,我听说内存泄漏和其他不好的事情发生。另请记住,每次执行脚本时,PHP 仅具有有限数量的资源 ID(用于文件句柄、数据库连接等)。

最好使用其他东西,也许是 python 或 perl,虽然我没有编写这类应用程序的任何实际经验,但我知道 PHP 不适合你想做的事情。

于 2008-09-02T01:03:45.760 回答