2012-10-04 160 views
2

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

+1

只是一个猜测,但我会说,一旦命令发送,浏览器的工作就完成了。熟悉打印工作可能:您可以关闭图片,打印图片 – Sprottenwels

回答

-1

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

此外,事情可能会因不同的操作而不同 - 即文件I/O或数据库操作。如果它是一个原子数据库操作,我的假设是,它会完成任何操作。

+1

但OP没有要求假设(并且您知道他们[对他们说](http://www.youtube.com/看?v = wg4trPZFUwc))。请参考手册,不要猜测。 – CodeCaster

2

该请求具有3份

  1. 连接到网络服务器,它是由查询在DB服务器运行的服务器
  2. 执行
  3. PHP脚本浏览器

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

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

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

2

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

ignore_user_abort(true); 
set_time_limit(0); 

您可以使用connection_status跟踪如果连接已经断开

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

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

更多细节在手册中有关连接处理http://www.php.net/manual/en/features.connection-handling.php

在PHP内部,连接状态得以维持。有3种 可能的状态:

0 - 师范大学

1 - 中止

2 - TIMEOUT

当PHP脚本运行正常正常状态时,是有效的。如果 远程客户端断开连接,ABORTED状态标志打开。 A 远程客户端断开连接通常是由用户点击其“停止”按钮导致的。