当PHP进程死亡时,发送电子邮件的最佳方法

10

我写了一个快速的PHP网页来处理502请求。当出现502错误时,Nginx将重定向到此页面并触发一封电子邮件。

问题是,大多数情况下遇到502错误是因为PHP已经崩溃,因此无法再使用PHP写入数据库和发送电子邮件。对PHP-FPM设置进行调整有很大帮助(重新启动PHP等),但我仍然希望有备用方案。

有许多方法可以在PHP之外发送电子邮件,但我很想知道其他人在这方面做得怎么样?我希望保持配置简单(即不必担心服务器上的另一个复杂依赖项)和可靠性原因。

在谷歌搜索和SO中搜索并没有找到太多信息,可能是因为“dies”和“fail”对我的情况产生了许多误报。


4
我不熟悉nginx配置,但是您可以将502处理程序配置为CGI脚本吗?然后您可以让它直接执行php cli二进制文件,这样始终会生成一个新的、清新无污染的进程。 - goat
这是一个好主意。Nginx默认不支持CGI,但可以代理到另一个支持CGI的Web服务器。经过一些研究,thttpd符合我的需求。我需要继续尝试一下,但我可以设置一个简单的bash脚本来调用PHP cli解析我的PHP脚本。额外的好处是,我不需要编写任何新内容,而且可以获得脚本已提供的所有功能。 - Brian
确保发布你的答案,所有那些对你的问题的点赞都意味着人们想看到一个答案(你可以回答自己的问题)。 - goat
@iputonmyrobeanwizardhat 我相信你也可以从该处理程序执行命令行脚本,当然这个脚本也可以是 PHP 脚本。 - dualed
你应该将PHP进程作为Linux进程进行监控。一种方法是使用http://ps-watcher.sourceforge.net/。 - Ismael Vacco
显示剩余2条评论
3个回答

1

可以考虑使用基于bash的cronjob定期(每x小时)解析error_log文件,并在最近一段时间(x小时内)发现类似于resuming normal operations的内容时发送电子邮件(mutt/mail)。我认为这种方法简单而有效...

[Thu Dec 27 14:37:52 2012] [notice] caught SIGTERM, shutting down
[Thu Dec 27 14:37:53 2012] [notice] Apache/2.2.22 (Ubuntu) PHP/5.4.6-2~precise+1 configured -- resuming normal operations

更新:

@Brian 象@takeshin所说的那样,cronjob可以按您的意愿每秒运行,但是一些系统管理员可能会咬你... :|


这确实是一个好主意,但不符合我的需求。我正在寻找实时通知。我需要在遇到502错误时立即得知,而不是可能几个小时后。 - Brian
@brian,希望你能找到解决方案。我们所有点赞你的问题的人都在期待着...祝你好运。 - Igor Parra
@Brian 你可以设置cron每秒运行一次,这样就是“实时”的了。但是实时通知可能会很危险,如果有人发现如何触发发送邮件的错误,你的邮箱将会被淹没。请参考Zend_Log以获取不同级别的错误日志记录。 - takeshin

1

这是我最终做的事情。我还没有将其推广到我们的生产服务器上,但到目前为止所有的测试看起来都很好。

Nginx本身不支持CGI,所以你需要另一种方式来实现它。thttpd非常适合这个任务。在nginx wiki上有一个很好的介绍,展示了如何使用它。

我使用以下配置来配置thttpd:

dir=/var/www/htdocs
user=thttpd
logfile=/var/log/thttpd.log
pidfile=/var/run/thttpd.pid
port=8000
cgipat=**.cgi

然后我将其添加到我的nginx配置中:

error_page 502 @thttpd;

location @thttpd {
    include proxy.include;
    proxy_pass http://127.0.0.1:8000;
}

最后,我创建了一个基本的CGI脚本,调用命令行上的PHP,并传入我已经编写好的PHP脚本。这对我来说是一个理想的解决方案,因为该脚本已经设置好记录到我们的警报表并触发电子邮件。这也是实时的,因为脚本将在nginx返回502代码时立即执行(根据脚本逻辑,随后的502不会通过电子邮件轰炸我)。

我能够运行一些模拟测试,强制nginx返回502(更多信息请参见此处)。

我将继续调整它,但我对部署的相对容易性和我可以重复使用现有代码感到非常满意。


0

我们有双重解决方案。

如果PHP死亡,我们使用shell脚本发送电子邮件通知。我们在shell脚本中使用shell命令检查php服务是否正在运行,如果没有运行,我们将触发一个shell命令来发送电子邮件。

这全部都在几行Shell脚本中完成。不太难。

当然,要在cron中设置它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接