作者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