关闭浏览器时服务器是否"shut down"?PHP - MYSQL



我想知道,当我写了一段代码,可以更新多达10000行,可能需要几秒钟才能完成时,如果通过ajax请求访问文件时,后查询被发送到php文件,然后浏览器关闭,文件是否完全执行?假设完成请求大约需要25秒,用户可能不会等待25秒,那么当mysql查询发生时,"ping"这个文件并让用户浏览或关闭其浏览器窗口就足够了吗?

请求有三部分

  1. 连接到web服务器的浏览器
  2. 由服务器执行的PHP脚本
  3. 数据库服务器中运行的查询

关闭浏览器时,与服务器的连接将关闭。服务器可能会也可能不会终止已启动的PHP脚本(如果PHP作为apache模块运行,则它将被终止,除非调用ignore_user_abort)。此外,网络服务器可能对请求有时间限制,并终止脚本或只向客户端发送连接超时消息,而不终止脚本,但不给它向浏览器发送任何内容的机会。

这里有一个棘手的部分——更新是在数据库中运行的,它不会被web服务器杀死,也不会被PHP杀死。

因此,您想要实现的是ping PHP脚本,即执行查询,但客户端不等待结果。您可能希望也可能不希望查询本身是异步的(PHP脚本不等待查询),但您必须告诉客户端请求已经完成,例如发送0的内容长度,刷新输出(实际上是http头),并使用ignore_user_abort运行PHP,以便它继续执行。

即使在客户端断开后,也可以使用忽略用户中止来继续运行脚本

ignore_user_abort(true);
set_time_limit(0);

您可以使用connection_status来跟踪连接是否已断开

if (connection_status()!=0) { //connection disconnected

以下是您的问题的答案:

http://www.php.net/manual/en/features.connection-handling.php

通常不会,但您的脚本以ABORTED状态通过。

有关连接处理的手册页面中的更多详细信息:http://www.php.net/manual/en/features.connection-handling.php

在PHP内部,会维护连接状态。有3个可能的状态:

0-正常

1-中止

2-超时

当PHP脚本正常运行时,NORMAL状态为活动状态。如果远程客户端断开连接。ABORTED状态标志打开。A远程客户端断开连接通常是由用户点击STOP按钮。

一旦关闭浏览器,它就会在收到回复之前断开与服务器的连接。我不知道不同的服务器在这种情况下的具体行为,但我认为大多数服务器都会中止他们正在处理的线程来回复请求。

此外,不同的操作(即文件i/o或数据库操作)可能会有所不同。如果它是一个原子数据库操作,我的假设是,它将完成任何方式。

最新更新