我有一个很大的错误类,它连接到set_error_handler()
,set_exception_handler()
,甚至register_shutdown_function()
(运行error_get_last()
)以捕获每个可能的错误。这一切都很重要,因为这是一个必须只输出JSON的API,因此错误类拦截所有PHP的错误并将它们添加到响应JSON中。
但是,出于某种原因,当网关超时时,我仍然收到标准的非JSON响应。在这种情况下,超时是由MySQL长时间响应(> 60秒)引起的。
错误可能以某种方式被传递回Nginx,但我不确定如何确认这是否正在发生。
我的问题:如何在PHP中捕获网关超时?
我能确认的是:
环境:
操作系统:Fedora 27 PHP:运行PHP 7.2的PHP-FPM 网络服务器:Nginx 1.12.1 数据库:MySQL 5.6.27
简短回答:你不能用PHP做到这一点。
答案很长:你不应该用PHP来做。这适用于任何后端系统。提供JSON的唯一可靠方法是让您的Nginx服务器处理它。如果您的后端被破坏,例如服务器过载,磁盘空间不足或者负载过重,那么您无法编写任何PHP代码来解决此问题。它不会运行。它无法运行。
这意味着将Nginx配置更改为具有基于JSON的错误文档,如果脚本需要太长时间,则可以将其发出。
您可以使用自定义error_page
指令执行此操作。
另一件需要考虑的事情是打开Nginx等待PHP响应多长时间的窗口,这样就不会让人不耐烦并提前终止你的请求。
根据您调度这些调用的方式,您需要调整fastcgi_read_timeout
或proxy_read_timeout
。还有其他像proxy_connect_timeout
和proxy_send_timeout
有关尝试将请求转发给PHP以及client_header_timeout
和client_body_timeout
,当客户端本身在完成请求之前停止时会发生这种情况。