2014-07-21 218 views
0

在客户端,用户点击一个下载按钮,(apache)web服务器(和PHP5.4)会创建一个非常大的文件,发送给客户端。因为创建这个(巨大)文件需要一段时间,5分钟后浏览器(FF)会提示消息:“连接超时:10.0.0.100服务器响应时间过长”。浏览器时钟:example.com服务器花费太长时间来响应

在我的PHP页面上,我设置了一个很长的超时时间:set_time_limit(3600);但这并没有帮助。在服务器生成文件之前,我尝试回显一个空白区域,让浏览器知道有响应,但是这种技巧会将文件内容发送到浏览器本身,这不是我想要的。

由于我使用的标题,但我认为这是没有任何东西之前,浏览器超时的从服务器发送的问题:

$size= filesize($path); 
$fname = basename ($path);  
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: public"); 
header("Content-Description: File Transfer"); 
header("Content-Disposition: attachment; filename=\"".$fname."\""); 
header("Content-Transfer-Encoding: binary"); 
header("Content-Length: ".$size); 
header("Content-type: application/octet-stream"); 
ob_clean(); 
flush(); 
readfile($path); 
exit; 

如何解决这个问题的任何想法?也许有一种JavaScript方式?

回答

2

我会通过ajax(call generate.php)开始创建文件,向客户端显示一条消息:“您的文件正在生成,准备就绪时会下载,请不要关闭浏览器”。

在generate.php,完成时设置一些种类标志,例如更新数据库,将文件保存到磁盘等

初始阿贾克斯后generate.php,定期(比如每30秒)使一个ajax请求check.php,它检查上面提到的标志。

如果找到,则将文件uri返回给调用js,然后可以将其下载(设置window.location或隐藏的iframe的src)

相关问题