服务器进入无限循环状态,客户端停止会发生什么?

11

我正在尝试弄清楚服务器与客户端之间的“对话”是如何进行的。

因此,当服务器生成一个无限循环时,例如echoing"hello<br />",当客户端停止或点击“后退”时会发生什么?

服务器如何知道循环结束,还是它要在旁边运行无限进程?

是否有任何地方可以阅读相关内容以了解整个过程?


理论上,服务器在执行时间达到请求超时值(或某些运行时、堆栈溢出、内存不足等错误)之前不会停止。 - scibuff
通过无休止地回显,它为什么会遇到任何错误或限制呢? - Ted
它最终会达到请求超时限制。 - scibuff
谁设置了这个超时时间?是客户端请求还是服务器设置? - Ted
1
根据请求,Apache有一个端点(客户端),通过TCP/IP协议进行通信(在此情况下,HTTP建立在TCP/IP协议之上)。一旦客户端连接,Apache会在其中一个客户线程中启动PHP进程。该线程执行工作,当完成执行时(由PHP进程发出信号),它将响应返回给客户端。如果我们谈论无限循环,那么要么服务器崩溃(由于RAM耗尽),要么进程被终止(如果设置某些变量(max_execution_time等))。 - N.B.
3个回答

19
客户端(浏览器)与您的服务器建立了TCP/IP会话,等待您网站的HTTP响应。当用户点击后退/取消/关闭时,此TCP连接将立即由客户端关闭。
Web服务器(如Apache)将通知PHP解释器TCP连接关闭
除非php.ini指令ignore_user_abort被设置为1(在服务器端,默认为0),否则PHP解释器将在当前原子操作完成时中止脚本执行(在您的示例中:echo())。
然而,即使您将ignore_user_abort显式设置为1,您仍会遇到PHP的max_execution_time或apache的TimeOut(两者在服务器端也可以配置)。
还请参见ignore_user_abort()set_time_limit()

0
即使您的 PHP 脚本有一个无限循环,php.ini 中也有一个 max_execution_time,如果时间超过了预设值,它将终止该进程。
我不确定当客户端关闭连接时它会如何工作。Apache 可能会杀死该进程,但我不认为 PHP 会被通知到客户端的连接关闭。

-1
如果在脚本中使用set_time_limit(0);(这样PHP解释器就会让它一直运行),那么该脚本可能会一直运行,直到Web服务器在TimeOut变量设置的时间后将其终止(我认为默认为300秒,并且据我所知,这只是Apache设置)。
请参见Apache的TimeOut指令文档

TimeOut 变量在哪里设置的?由谁设置? - Ted
@Ted:在httpd.conf、apache2.conf或apache.conf中,根据你的操作系统而定。实际管理网络服务器设置的人将是设置该值的人,我认为它只是一个服务器级别的变量(这意味着你可能无法在虚拟主机级别更改它)。我已经更新了我的答案,并附上了一个链接。 - WWW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接