当用户下载时,为什么他们无法加载另一个页面?

时间:2012-04-05 00:42:11

标签: php download fopen fread

下载脚本的相关代码:

$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);

在下载过程中,同一站点的任何其他页面都不会加载。但他们仍然在另一个浏览器中加载。我认为这与下载页面不断“加载”以阻止其他页面加载这一事实有关?

关于我如何解决这个问题的任何建议?对于大文件,我不希望用户在下载过程中无法浏览网站

2 个答案:

答案 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_xsendfileXSendfile来提供文件。

如果无法做到这一点,您可以随时尝试使用readfile()功能简化传送文件的过程。