保持PHP脚本作为守护进程运行的最佳方法是什么?

时间:2008-09-01 23:20:59

标签: php daemon

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

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

9 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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

答案 2 :(得分:3)

我们通过将输出传递给邮件来运行我们的守护进程。

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

这样,当守护进程停止时,它会发送一封邮件,我们会收到通知。

它仍然意味着手动重启守护进程当然,但我们马上就知道了。通常情况下,如果守护进程停止,则意味着还有其他东西需要照顾,所以通常都可以。

答案 3 :(得分:3)

最优雅的解决方案是phpdaemonreactPHP

答案 4 :(得分:1)

我在运行wget并将结果发送到共享服务器上的/ dev / null方面取得了成功。

答案 5 :(得分:1)

守护程序是一个在后台运行的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中创建守护进程的非常好的文章。您可以在link

上阅读此内容

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

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

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

答案 8 :(得分:-1)

TBH,PHP可能不是最好的工具,真的不是它的设计目标。我听说你尝试这个时会发生内存泄漏和其他不好的事情。另外请记住,每次执行脚本时,PHP只有一定数量的资源ID(用于文件句柄,数据库连接等)。

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