我有一个很大的错误类,它挂钩到set_error_handler()
,set_exception_handler()
,甚至是register_shutdown_function()
(运行error_get_last()
),以便捕获每个可能的错误。这一切都很重要,因为这是一个必须只输出JSON的API,因此错误类拦截所有PHP的错误并将它们添加到响应JSON中。
但是,出于某种原因,当网关超时时,我仍然收到标准的非JSON响应。在这种情况下,超时是由MySQL长时间响应(> 60秒)引起的。
错误可能以某种方式被传递回Nginx,但我不确定如何确认这是否正在发生。
我的问题:如何在PHP中捕获网关超时?
我可以确认:
环境:
OS: Fedora 27
PHP:运行PHP 7.2的PHP-FPM
网络服务器: Nginx 1.12.1
数据库: MySQL 5.6.27
答案 0 :(得分:2)
简短回答:你不能用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
,这些都是在客户端本身在完成请求之前停止时发生的。 / p>