浏览器关闭时服务器是否“关闭”? PHP - MYSQL

时间:2012-10-04 14:23:30

标签: php apache http lamp

我很想知道 - 因为我写了一段代码片段,可以更新多达10,000行,可能需要几秒钟才能完成,如果通过ajax请求访问文件时,帖子查询会发送到php文件,然后浏览器关闭,文件是否完全执行?假设完成请求大约需要25秒,用户可能不会等待25秒,是否足以“ping”此文件并让用户在进行mysql查询时浏览或关闭其浏览器窗口?

5 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

请求有3部分

  1. 连接到网络服务器的浏览器
  2. 由服务器执行的PHP脚本
  3. 在数据库服务器中运行的查询
  4. 关闭浏览器时,将关闭与服务器的连接。服务器可能会也可能不会终止已启动的PHP脚本(如果PHP作为apache模块运行,它将被终止,除非调用ignore_user_abort)。此外,Web服务器可能有一个请求的时间限制,要么终止脚本,要么只是向客户端发送连接超时消息,而不会终止脚本,但是没有给它机会向浏览器发送任何内容。

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

    所以你想要实现的是ping一个PHP脚本,即执行查询,但客户端不等待结果。您可能希望或者可能不希望查询本身是异步的(PHP脚本不等待查询),但您必须通过发送内容长度为0来告诉客户端请求已完成,并刷新输出(实际上是http标头),并使用ignore_user_abort运行PHP,以便继续执行。

答案 2 :(得分:2)

即使客户端已断开连接,也使用ignore-user-abort继续运行脚本

ignore_user_abort(true);
set_time_limit(0);

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

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

答案 3 :(得分:0)

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

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

  

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

     

0 - 正常

     

1 - ABORTED

     

2 - TIMEOUT

     

当PHP脚本正常运行时,NORMAL状态处于活动状态。如果   远程客户端断开ABORTED状态标志已打开。一个   远程客户端断开通常是由用户打他的   停止按钮。

答案 4 :(得分:-1)

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

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