下载脚本的相关代码:
$fp = @fopen($file, 'rb');
while(!feof($fp) && ($p = ftell($fp)) <= $end) {
if ($p + $buffer > $end) {
$buffer = $end - $p + 1;
}
echo fread($fp, $buffer);
flush();
if($limits["Max_DL"]) sleep(1);
}
fclose($fp);
在下载过程中,同一站点的任何其他页面都不会加载。但他们仍然在另一个浏览器中加载。我认为这与下载页面不断“加载”以阻止其他页面加载这一事实有关?
关于我如何解决这个问题的任何建议?对于大文件,我不希望用户在下载过程中无法浏览网站
答案 0 :(得分:3)
如果您的下载脚本随时调用session_start()
,则需要在将文件流式传输给用户之前调用session_write_close()
。
这会关闭PHP会话文件并允许用户加载另一个可能正在调用session_start
的页面(因此正在等待对会话文件的锁定)。
注意:您在调用$_SESSION
后仍然可以阅读session_write_close()
,但任何修改都将被丢弃 - 您刚刚告诉PHP您已完成对会话的更改。
更多信息: http://us2.php.net/manual/en/function.session-write-close.php
答案 1 :(得分:0)
PHP不是提供大型文件的最佳解决方案,因为您将在整个下载过程中为每个用户占用服务器上的进程;如果您使用的是Apache或nginx,则应考虑使用mod_xsendfile或XSendfile来提供文件。
如果无法做到这一点,您可以随时尝试使用readfile()
功能简化传送文件的过程。