当您收到504网关超时时,PHP脚本会停止执行吗?


8

我在共享服务器(Siteground)上,并且由于我的WordPress PHP脚本花费了30秒钟以上,因此它返回504网关超时。

如果没有其他错误,查询是否可以运行并完成?

编辑:我问为什么我收到此错误给我的托管团队,在这里Siteground托管专家解释了此问题,如下所示:

我们在所有服务器上同时使用Apache + Nginx。Apache用于主要的Web服务,而Nginx用作反向代理和分布式缓存。当无法从缓存提供响应时(通常是指动态内容),Nginx会向Apache发送请求。这在Apache处理请求时将其转发到您的网站,并根据PHP逻辑可以完成MySQL查询或获取其他数据。如果此过程花费的时间太长,并且Apache没有及时将响应返回给Nginx,您将看到此错误。简而言之,Apache无法处理请求,因为应用程序确实在允许的时间内完成了该过程。这也意味着启动的过程很可能没有完全完成,并且某些数据/操作可能已经保存/执行。

专家说"initiated process most probably not completed fully"

我的方案的更多详细信息:我的脚本将使用wp_insert_post方法的woocommerce产品添加到我的wordpress网站。添加产品后,它将显示新添加的产品的图像。

当我添加1个产品(40个变体)时,它完成并显示产品图片。当我添加6个产品(240个变体)时,我直接在浏览器中收到错误消息。

因此,为了进一步测试该问题,我修改了代码,并使用ajax重新编写了代码,并添加了像system这样的进程栏。(每个变体递增一个数字)。

运行1个产品(具有40个变体)的代码后,进程号增加到40,并显示产品图像。

当我为6种产品运行代码时,进程号增加到240,但它什么都不显示,当我检查时,它收到504错误。(jQuery.Ajax功能错误部分)

因此,这使我认为该查询即使在超时时仍在运行,但是我仍然不能确定,并且由于504网关超时错误而正在寻找详细信息,因为对此没有很好的文档。


1
这可能取决于网关超时来自何处。这是个有趣的问题。
斯蒂芬·奥斯特米勒

@StephenOstermiller根据您的评论添加了更多详细信息。
HOY

如果所有“ 6个产品(240个变体)”都已添加到您的网站,您大概会知道脚本是否完成?还是很难确定?也许在脚本中添加了一些日志记录功能?
怀特先生

Answers:


3

直到PHP本身超时,脚本才会停止执行。

504错误是在网关/代理本身上生成的,它不是来自php进程。

这是因为,如果您的Apache带有Apache-mod-php,则永远不会收到此错误,因为没有代理。

扩展说明,请考虑如下:

您有一个PHP进程。PHP进程可以是PHP-FPM,PHP-CGI或Apache-MOD-PHP。在此过程中,您将超时(在php.ini或ini_set上配置)。

PHP代理在允许的时间内给出响应(又名:如果您有set_time_limit(600),则您的PHP进程最多可以运行10分钟)。

与这句话没有关系,您可以让另一个进程等待以下响应:这是apache(配置为通过cgi或fpm与php联系),nginx,lighthttpd等的情况。由apache-mod-php配置的apache并非如此。第二个过程有一个新的超时(proxy_timeout),在vhost /常规服务器应用程序配置中配置。到那时,程序将等待来自PHP处理引擎的响应。

最后一句话,可以在每个代理/网关上重复。

考虑这种情况:

haproxy(超时1)-> Nginx(前端/缓存)(超时2)-> Apache(超时3)-> PHP-FPM(PHP超时/ set_time_limit)。

一个非常简单的场景:

Apache(使用apache-mod-php)(PHP超时/ set_time_limit)。

每个超时出现(PHP超时本身除外)都是504 HTTP网关超时错误的可能原因。


“如果您的Apache带有Apache-mod-php,您将永远不会收到此错误”-您能解释一下最后一句话吗?
怀特先生

当您将Apache服务器与mod-php一起使用时,执行工作由Apache本身完成。因此,您无法获得504超时,因为进程上没有任何网关。如果使用php-cgi或php-fpm,则Apache / nginx /其他Web服务器将充当真正处理引擎的代理或网关。然后,当此网关在配置的时间内未收到响应时,出现504错误。
樱花木本樱'18

但是您可以在Apache mod-php前面没有Nginx反向代理吗?
怀特先生

显然,但这不是问题本身。在这种情况下,可以由nginx给出504,但不能由Apache给出。关于这种情况的问题是,如果谁生成504错误代码是由代理生成的,则由代理调用触发的执行不会停止。对于网关或代理,至少有两个计时器在起作用。代理通信的超时(例如,在nginx上)和php进程的超时。
樱花木本樱'18

我明白。但是在这种情况下,您的最后一句话似乎并不完整,因为这意味着仅使用Apache-mod-php(无论是否有前端代理)都可以避免此错误。我假设您的意思是...“如果您只有 Apache且具有Apache-mod-php且没有前端代理(在这种情况下为Nginx),那么您将永远不会收到此错误”?
怀特先生

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.