浏览器提示:example.com上的服务器响应时间过长

时间:2014-07-21 13:54:53

标签: javascript php firefox download connection-timeout

在客户端,用户单击下载按钮,(apache)webserver(和PHP5.4)然后创建一个非常大的文件,完成后必须发送到客户端。因为创建这个(巨大的)文件需要一段时间,浏览器(FF)会在5分钟后提示消息:"连接超时:10.0.0.100的服务器响应时间太长而无法响应"

在我的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方式?

1 个答案:

答案 0 :(得分:2)

我将通过ajax(调用generate.php)启动文件创建,向客户端显示消息"正在生成您的文件,并在准备好后下载。请不要关闭浏览器"。

在generate.php中,完成后设置某种标志,例如更新数据库,将文件保存到磁盘等。

在初始ajax到generate.php之后,定期(比如说每30秒)向check.php发出一个ajax请求,检查上面提到的标志。

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