0

下载脚本的相关代码:

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

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

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

4

2 回答 2

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

于 2014-01-14T18:19:04.317 回答
0

PHP 不是交付大文件的最佳解决方案,因为您将在服务器上为每个用户占用整个下载过程中的进程;如果您使用的是 Apache 或 nginx,您应该考虑使用mod_xsendfileXSendfile来提供文件。

如果这不可能,您总是可以尝试通过使用该readfile()功能来简化交付文件的过程。

于 2012-04-05T00:59:01.540 回答