我在服务器上有一个PHP脚本将文件发送给配方:它们获得一个唯一的链接,然后他们可以下载大文件.有时传输出现问题,文件已损坏或永不完成.我想知道是否有更好的方法来发送大文件
码:
$f = fopen(DOWNLOAD_DIR.$database[$_REQUEST['fid']]['filePath'], 'r'); while(!feof($f)){ print fgets($f, 1024); } fclose($f);
我见过的功能如
http_send_file http_send_data
但我不确定他们是否会奏效.
解决这个问题的最佳方法是什么?
问候
erwing
如果您要发送真正大的文件并担心它会产生的影响,您可以使用x-sendfile头.
从SOQ 使用-xsendfile-with-apache-php,一个howto blog.adaniels.nl:how-i-php-x-sendfile /
最好的解决方案是依赖lighty或apache,但如果在PHP中,我会使用PEAR的HTTP_Download(不需要重新发明轮子等),有一些不错的功能,如:
基本限制机制
范围(部分下载和恢复)
请参阅介绍/使用文档.
文件分块是PHP最快/最简单的方法,如果你不能或不想使用一些更专业的像卷曲,mod-xsendfile
在阿帕奇或一些专门的脚本.
$filename = $filePath.$filename; $chunksize = 5 * (1024 * 1024); //5 MB (= 5 242 880 bytes) per one chunk of file. if(file_exists($filename)) { set_time_limit(300); $size = intval(sprintf("%u", filesize($filename))); header('Content-Type: application/octet-stream'); header('Content-Transfer-Encoding: binary'); header('Content-Length: '.$size); header('Content-Disposition: attachment;filename="'.basename($filename).'"'); if($size > $chunksize) { $handle = fopen($filename, 'rb'); while (!feof($handle)) { print(@fread($handle, $chunksize)); ob_flush(); flush(); } fclose($handle); } else readfile($path); exit; } else echo 'File "'.$filename.'" does not exist!';
来自richnetapps.com/NeedBee.在200 MB文件上进行测试readfile()
,即使设置了最大允许内存限制,也会死亡,这1G
比下载文件大小多五倍.
顺便说一句:我也在文件上对此进行了测试>2GB
,但PHP只设法先写入2GB
文件,然后断开连接.与文件相关的函数(fopen,fread,fseek)使用INT,因此你最终达到了极限2GB
.mod-xsendfile
在这种情况下,上述解决方案(即)似乎是唯一的选择.
编辑:让自己100% ,你的文件保存在utf-8
.如果省略,则下载的文件将被破坏.这是因为此解决方案用于print
将文件块推送到浏览器.