添付ファイルダウンロード等の効率化

関連

メッセージ

(readfileの利用は継続。出力バッファリングを明示的にOFFにする対応を行いました (2017-08-23 by umorigu))


PHP 5.0.4 には、readfile() や fpassthru() が 2000000 バイトで停止してしまうというバグがあるらしいです。

http://bugs.php.net/bug.php?id=32553

プラグイン attach, dump, ref で readfile が使われており、例えば、2000000バイトを越える添付ファイルをダウンロードすると、2000000バイトで切れてしまいます。

PHP 5.0.4 以外では大丈夫だと思いますが、readfile はファイル内容を一度メモり上に読み込みますので、あまり、サーバーに優しくありません。また、readfile よりも、echo fread() を繰り返した方が高速らしいです。

http://jp.php.net/readfile

という訳で、readfile を使っている部分を、echo fread() で置き換えませんか?

例えば、attach.inc.php は以下のようになります。

Index: attach.inc.php
===================================================================
RCS file: /cvsroot/pukiwiki/pukiwiki/plugin/attach.inc.php,v
retrieving revision 1.79
diff -c -r1.79 attach.inc.php
*** attach.inc.php	8 Aug 2005 14:54:15 -0000	1.79
--- attach.inc.php	29 Aug 2005 12:32:28 -0000
***************
*** 659,665 ****
  		header('Content-Length: ' . $this->size);
  		header('Content-Type: '   . $this->type);
  
! 		@readfile($this->filename);
  		exit;
  	}
  }
--- 659,672 ----
  		header('Content-Length: ' . $this->size);
  		header('Content-Type: '   . $this->type);
  
! 		$handle = fopen($this->filename, 'rb');
! 		while (!feof($handle))
! 		  {
! 		    echo fread($handle, 4096);
! 		    flush();
! 		  }
! 		fclose($handle);
! 
  		exit;
  	}
  }

fopen できなかった時はどうすべきですかね? @readfile となっているのに合わせて、なにも表示せずに exit?

参考




*1 詳しく追ってません

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-08-27 (日) 07:18:55
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.296 sec.

SourceForge