保持PHP脚本作为守护程序运行的最佳方法是什么?
保持PHP脚本作为守护程序运行的最佳方法是什么,以及检查是否需要重新启动的最佳方法是什么。
我有一些脚本需要运行24/7,大多数情况下,我可以使用nohup运行它们。但是,如果它们掉线了,监视它以便自动重新启动的最佳方法是什么?
解决方案
回答
如果我们不能使用(适当的)初始化结构来执行此操作(我们正在共享主机上,等等),请每隔几分钟使用cron运行脚本(可以使用我们喜欢的任何一种语言编写),以检查查看它们是否正在运行,并在必要时重新启动它们。
回答
TBH,PHP可能不是最好的工具,实际上不是它的设计目的。我听说过尝试这种操作时会发生内存泄漏和其他不良情况。另外请记住,每次执行脚本,PHP仅具有有限数量的资源ID(用于文件句柄,数据库连接等)。
尽管我没有编写此类应用程序的实际经验,但最好还是使用其他东西,例如python或者perl,但我确实知道PHP不适合尝试。
回答
我已经成功运行了wget并将结果发送到共享服务器上的/ dev / null。
回答
快速又肮脏的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
回答
我使用基于PHP的脚本从数据库读取并发送电子邮件(使用PEAR Mail_Queue库)。我从bash脚本中运行它,并基于返回的结果(来自" exit $ status;")停止运行,睡眠X秒或者立即重新启动。 (我还检查了平均负载/睡眠情况到PHP脚本中,以避免给邮件系统造成压力)。
如果需要长期运行的守护程序,那么我同意,运行该守护程序可能不是最好的选择(尽管我听说有些套接字服务器可以长期成功运行), PHP 5.3现在也确实改善了垃圾回收,并且如果脚本编写得足够好而不会意外退出,那么内存应该比以前少了很多。
回答
我们通过将输出通过管道发送到邮件来运行守护程序。
php daemon.php | mail -s "daemon stopped" [email protected]
这样,当/如果守护程序停止,它将发送邮件,并以这种方式通知我们。
当然,这仍然意味着需要手动重启守护进程,但是我们马上就会知道。通常,如果守护程序已停止,则意味着无论如何都需要处理其他事项,因此通常可以。