我很想知道 - 因为我写了一段代码片段,可以更新多达10,000行,可能需要几秒钟才能完成,如果通过ajax请求访问文件时,帖子查询会发送到php文件,然后浏览器关闭,文件是否完全执行?假设完成请求大约需要25秒,用户可能不会等待25秒,是否足以“ping”此文件并让用户在进行mysql查询时浏览或关闭其浏览器窗口?
答案 0 :(得分:3)
答案 1 :(得分:2)
请求有3部分
关闭浏览器时,将关闭与服务器的连接。服务器可能会也可能不会终止已启动的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或数据库操作,情况可能不同。如果它是一个原子数据库操作,我的假设是,它将完成任何方式。