作者wnick (浅龙勿用)
看板PHP
标题Re: [请益] readfile 效率问题
时间Sat Dec 4 20:05:39 2010
※ 引述《previa (Southern Cross)》之铭言:
: ※ 引述《KoShiyen (http://0rz.net/e70jv)》之铭言:
: : 我写了一个程式过滤下载的使用者
: : 通过的才会用 readfile 放档案给他, 否则会改放拒绝的图档
: : 可是本来直接下载时很快很容易下载的档
: : 透过 readfile 就变成慢得不得了
: : 开一个档常常要等好几分钟才开始下载
: : 用不同的 webhost 也是得到同样的结果
: : 请问这是设定的问题还是程式的问题?
: : 用 readfile 释出档案前需要什麽特别的处理吗?
: : 谢谢.
: 这是我在别的地方看到的 我也有这个困扰 XD
: http://theserverpages.com/php/manual/en/function.readfile.php
: regarding php5:
: i found out that there is already a disscussion @php-dev about readfile()
: and fpassthru() where only exactly 2 MB will be delivered.
: so you may use this on php5 to get lager files
: <?php
: function readfile_chunked($filename,$retbytes=true) {
: $chunksize = 1*(1024*1024); // how many bytes per chunk
: $buffer = '';
: $cnt =0;
: // $handle = fopen($filename, 'rb');
: $handle = fopen($filename, 'rb');
: if ($handle === false) {
: return false;
: }
: while (!feof($handle)) {
: $buffer = fread($handle, $chunksize);
: echo $buffer;
: if ($retbytes) {
: $cnt += strlen($buffer);
: }
: }
: $status = fclose($handle);
: if ($retbytes && $status) {
: return $cnt; // return num. bytes delivered like readfile() does.
: }
: return $status;
: }
: ?>
我试了这个方法发现会有问题,
档案超过2G变成只下载1k就结束了,
原因是failed to open stream: File too large,
google一下有看到一篇说是因为32bit integer的关系,
可是
http://gaaan.com/cafetw?p=97673 这篇又说可以,
最後遇到的问题跟readfile()一样。
该怎麽解决这问题啊?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.244.250.159
※ 编辑: wnick 来自: 60.244.250.159 (12/04 21:27)
1F:→ Kelunyang:突然想到PHP似乎也有64bit版本XD 12/04 22:26
2F:→ Kelunyang:应该说平台改成64bit或许可以定址大一些 12/04 22:28
3F:→ arrack:不要一次读取,分区块读取,php.net上的readfile的回文中 12/05 11:39
4F:→ arrack:我自己测试过是ok,你要储存的位置如果本身是fat 12/05 11:42
5F:→ arrack:那就会下载失败了 12/05 11:43
6F:→ arrack:我不是指Server,是下载下来的存放位置的磁碟格式 12/05 11:43
7F:→ wnick:你说的PHP.NET上的READFILE是2010 8月那篇吗? 12/05 12:05
8F:→ wnick:那篇的写法有限制不要超过1G耶 12/05 12:07
9F:→ wnick:看来改成64位元作业系统比较省麻烦,至少我妥协了 12/06 19:33