memocon プログラミングのメモや物欲日記、雑記等

続・FuelPHPで巨大ファイルのダウンロードさせる

2013年05月01日 18時10分

前の記事でFuelPHPでのファイルのダウンロードが上手く動いたと書いたのですが本番環境だけ以下のようなエラーが出て悩んでおりました。

ダウンロードしたファイルの最後に上のエラーメッセージが付いてしまっていました。
ダウンロードファイルがzipファイルでエラーメッセージが付いていても正常に展開できていたので気付くのが遅れてしまいました。
後、ob_startが絡んでいるのかFuelPHPのログに出てなかったんですよね。

このエラーメッセージは何?とGoogle先生に聞いてみるとFuelPHPでこのエラーの場合はtimezoneが設定されていないのでconfig.phpで設定しましょうとばかり出てきます。
その設定は既にしているので今回は別原因です。

とりあえずはてぶさんのコメントにreadfileのドキュメントをよく読みましょう(拡大解釈)というコメントがあったので読んでみました。

PHP: readfile – Manual
http://www.php.net/manual/ja/function.readfile.php

確かに注意という項目に書いてあります。

では何故out of memoryエラーが発生したのか。

答えは続きに書いてありました。

確かに処理していた部分でob_get_level()をしてみると0ではなく2と帰ってきました。
ですのでご要望通りにバッファレベルを0にしてみたらreadfileだけで問題なくダウンロードできました。

ですが最初に記載したエラーメッセージは相変わらずダウンロードしたzipファイルの最後に付いてきます。

ここで心が折れそうになりましたが今回再確認したマニュアルをよく読みましょうの原点に戻り、
FuelPHPのdocsを読んでみるとなんとFile::downloadというメソッドが用意されているではありませんか。

FuelPHP File Usage Classes
http://fuelphp.com/docs/classes/file/usage.html#/method_download

ということでその一行に修正。

上記の修正で無事にエラーメッセージが付かない綺麗なzipファイルがダウンロードされました。

しかし今回の戦いはまだ続きます。

ダウンロードさせるだけならこれで問題ないのですがダウンロードさせる為に作成したファイルをダウンロード終了後に削除するという処理があるのです。
ファイルをダウンロード後にまた何か処理をしたい場合は自前でやるしか無理そうだったのでFile::downloadの中身を参考に以下のように実装してみました。

これでダウンロード後にファイルを削除するという処理をEvent::registerで登録すれば望む形の処理を実装することができました。

何かとはまることの多い処理だったので同じことで悩んでる人の参考になれば幸いです。