在PHP中捕获网关超时的困难

问题描述 投票:1回答:1

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

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

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

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


我能确认的是:

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

环境:

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

php mysql json nginx
1个回答
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,当客户端本身在完成请求之前停止时会发生这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.