下载文件代码
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文件下载控制速度坑