在脚本运行之前终止与浏览器的连接


Kill connection with browser before script is through running

我有一个脚本,它接受上传的文本文件,对其进行解析,然后在数据库中插入相当多的行。这个过程大约需要一分钟。

即使我使用AJAX,我也不希望我的用户看到Loading。。。在填充数据库的过程中持续一分钟以上。实际上,一旦解析成功完成,数据库INSERTS就会一直工作,因为在解析过程中所有内容都经过了验证。

因此,我需要做的是在解析成功后立即返回一个JSON字符串{success:true,data:{cartons: 1000, batchname:"Batch1"}}。我这样做了,但浏览器在连接关闭之前不会解析响应(脚本正在运行)。有没有办法让浏览器在响应到来时接受它,或者让我在PHP脚本继续运行的同时关闭与浏览器的连接?

我使用ExtJS作为处理AJAX的Javascript框架。有什么想法吗?这件事已经折磨了我大约一个星期了。

只需指定响应正文内容的长度:

  $out = 'Return this';
  header("Content-Length: " . strlen($out));
  header("Connection: close");
  echo $out;
  flush();
  echo 'But do not return this';
  // create some file to show that script continues its execution 
  file_put_contents('script.is.running', '');

此外,您还可以从后台的命令行运行其他脚本(无需等待它们完成),或对其中包含ignore_user_abort函数的脚本执行http请求。