在PHP

时间:2017-12-18 17:43:25

标签: php mysql json nginx

我有一个很大的错误类,它挂钩到set_error_handler()set_exception_handler(),甚至是register_shutdown_function()(运行error_get_last()),以便捕获每个可能的错误。这一切都很重要,因为这是一个必须只输出JSON的API,因此错误类拦截所有PHP的错误并将它们添加到响应JSON中。

但是,出于某种原因,当网关超时时,我仍然收到标准的非JSON响应。在这种情况下,超时是由MySQL长时间响应(> 60秒)引起的。

错误可能以某种方式被传递回Nginx,但我不确定如何确认这是否正在发生。

我的问题:如何在PHP中捕获网关超时?

我可以确认:

  • 语法都正确。
  • 如果查询及时执行,API会正常响应。
  • PHP致命错误,异常和其他错误都在正在运行查询的同一文件中正确捕获。

环境:

OS: Fedora 27
PHP:运行PHP 7.2的PHP-FPM 网络服务器: Nginx 1.12.1
数据库: MySQL 5.6.27

1 个答案:

答案 0 :(得分:2)

简短回答:你不能用PHP来做。

答案很长:你不应该在PHP中这样做。这适用于任何后端系统。提供JSON的唯一可靠方法是让您的Nginx服务器处理它。如果您的后端被破坏,例如服务器过载,磁盘空间不足或者负载过重,那么您无法编写任何PHP代码来解决此问题。它不会运行。它无法运行。

这意味着改变Nginx配置,使其具有基于JSON的错误文档,如果脚本耗时太长,则可以发出错误文档。

您可以使用自定义error_page指令执行此操作。

另一件需要考虑的事情是打开Nginx等待PHP响应多长时间的窗口,这样就不会让人感到不耐烦并提前终止你的请求。

根据您拨打这些来电的方式,您需要调整fastcgi_read_timeoutproxy_read_timeout。还有其他像proxy_connect_timeoutproxy_send_timeout有关尝试将请求转发给PHP以及client_header_timeoutclient_body_timeout,这些都是在客户端本身在完成请求之前停止时发生的。 / p>