php文件下载控制速度坑

下载文件代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    public function down($filename)
    {
        if(file_exists($filename) && is_file($filename))
        {
            ob_end_clean();
            ob_start();
            header("Cache-Control: public");
            header("Content-Description: File Transfer");
            header('Content-Type: application/octet-stream');
            header('Content-disposition: attachment; filename='.basename($filename));
            header("Content-Type: application/zip");
            header("Content-Transfer-Encoding: binary"); 
            header('Content-Length: '. filesize($filename));
            $download_rate = 200;
            $fh = @fopen($filename, 'rb');
            while(!feof($fh)){
               $bufer = fread($fh, $download_rate);
               echo $bufer;
               ob_flush();
               flush();
               usleep(500);
            }
            @fclose($fh);
        }
        else
        {
            die('Fatal error: file does not exist!');
        }
    }

坑一:sleep控制下载速度导致下载页面长时间卡住

看到网上其他朋友写的是 用sleep(1) 来控制,于是试了一下,别说控制速度了,简直是控制是否能下载成功。

按照代码来 意思是每秒向浏览器输出指定大小的内容,其实事实并非这样 (自己可以测试)。

通常想法 echo 200KB内容,浏览器就接受这么多,然后等你下一秒再发200KB。其实此时已经下载不成功了(谷歌浏览器)。

最后选择使用了usleep + $download 控制速度。500 + 200 最高大概300KB左右的速度

坑二:下载文件过程中由于session竞争锁导致其它页面卡住

我在统一的配置文件中加入了session_start() 最后导致文件下载过程中其它页面一直卡住

解决方法:在session_start()之后 条用 session_write_close() 释放 session 锁

未经允许不得转载:开心乐窝-乐在其中 » php文件下载控制速度坑

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏