[PHP-users 25867] Re: ファイルの出力中にメモリフロー

sho sho @ big.or.jp
2005年 6月 21日 (火) 08:49:42 JST


こんにちは、sho と申します。

[PHP-users 25045] ファイルの場所を隠す&読み込みながら書き出し
http://ns1.php.gr.jp/pipermail/php-users/2005-March/025564.html

という同じ内容のスレッドがありますよ。解決方法に関しても示して
ます。

At Mon, 20 Jun 2005 23:06:59 JST,
 keijiro <icm @ pepota.com> wrote:
> 
> --------------------
>  その1.
>  大容量バッファを出力しますが、正常に動作しません。
> --------------------
> 
> $theFile = "../movie.avi";
> header ("Cache-Control: must-revalidate, post-check=0, pre-check=0");
> header ("Content-Type: application/octet-stream");
> header ("Content-Length: " . filesize($theFile));
> header ("Content-Disposition: attachment; filename=mv.avi");
> $fp = fopen($theFile);
> flush();
> while(! feof($fp)){
> ob_start();
> $buf = fgets($fp, 4096);
> print $buf;
> ob_end_flush();
> }
> fclose($fp);

わざわざ ob_start させている理由がわかりません。outbuffer を使用する必要が
あるのでしょうか?

> --------------------
>  その2.
>  小さいファイルなら成功しますが、
>  サイズが大きくなると、止まります。
> --------------------
> $theFile = "../movie.avi";
> header ("Cache-Control: must-revalidate, post-check=0, pre-check=0");
> header ("Content-Type: application/octet-stream");
> header ("Content-Length: " . filesize($theFile));
> header ("Content-Disposition: attachment; filename=mv.avi");
> readfile($theFile);
> $fp = fopen($theFile);
> flush();
> readfile($theFile);
> ob_end_flush();

readfile を2度も呼んでますが?fopen は何のためでしょう?
あと、ob_end_flush はファイルを呼び出す前じゃないと、バッファをクリアする
意味がありません。

なんか、使用している関数に関してその動作に関して知らないで闇雲に並べてテスト
してる印象を受けます。マニュアルを一読されることをお勧めします。

-- sho


PHP-users メーリングリストの案内