毎日モザイク

White Room Layout Works

2007-01-16T16:06:01+09:00 [Tue]
--> [遺跡]

ググるな。

ここのページも同じですが、はやりググッてはいけませんね……。

PHPの学習にと、宅ファイル便もどきを作っているのですが、ダウンロード制限がどうにもうまく作れない。ずっと、公式マニュアルだけで闘っていたのですが、readfile()で読み出すと、でかいファイルでひっかかる。ここで、更に公式マニュアルを読めば良かったんですが、つい出来心でググってしまいました(w。

php.iniで、output_bufferingはoffになっているので、readfile()の仕様だとばかり思い込んでいました。どうやら、同じような思い込みをしている人が結構いるらしく、ググったら、readfile()で出力するときは、どうしてもその辺で引っ掛かるっていう内容のものが結構ありますた。

でかいものが落とせないなら、作っても楽しくないなぁ……。などとグルグルしておりました(w。

それで、もう一度、php.iniと公式マニュアルを禿げしく読んでみたら、引っ掛かっていた原因は、output_bufferingじゃなくて、output_handle = mb_output_handlerでした……。

公式マニュアルを始めから、通読すればよかったのですよorz。

output_handler string
スクリプトの全ての出力を関数にリダイレクトすることができます。 例えば、output_handler に mb_output_handler() を指定した場合、文字エンコーディングは透過的に指定したエンコーディングに 変換されます。出力ハンドラを指定することにより自動的に出力 バッファリングを on にします。

「自動的に出力バッファリングをonにします。」って、思いっきり日本語で書いてありますたorz。

4.1.0 以降のバージョンでは、以下の条件が満たされた場合にこのハンドラは charset HTTP ヘッダを設定します。
*
header() で Content-Type が 設定されていない場合
*
デフォルトの MIME 型が text/ で始まる
*
http_output の設定が pass 以外

ここだけ読んで、Content-Typeを設定してやればオケ。と思っていたのですが、Content-Typeが設定されていれば(text以外)、何もしないけどバッファはする。ってことのようです。

ここの設定をそのままにして、バッファリングさせないには、headerを出力した後で、ob_end_flush()(output bufferをflushして、バッファリングを止める)してからreadfile()すれば、読んじゃ出し、読んじゃ出し状態になるようです。

一歩前進(笑。

ググる前に公式ドキュメント。もう一度念仏(w。