[PHP-users 34259] コンテンツ出力がされたかどうか知る方法

shounari ml @ shiftra.jp
2009年 2月 4日 (水) 12:55:26 JST


肥田と言います。


コンテンツがすでに出力済かどうかを知る方法を探しています。

重いDB処理をいくつも行う必要があるため、ひとつのSQLが終わる度に
半角スペースを画面出力して ブラウザのタイムアウトを防ぐようにしたい
と考えています。
それをDB処理モジュールで行いたいのですが、画面出力が行われていない
タイミングでも そのモジュールは利用するため、なんらかのスイッチを
付ける必要があります。

すでにプログラムが膨大なサイズとなっているため、全部の画面側・もしくは
コマンドライン側に ひとつひとつスイッチを付けて回るのは避けたいので、
考えたのは コンテンツ出力がされていれば上記処理を行うという仕様です。


検討したのは以下の通りです。

headers_sent() により、これが送信済の場合は コンテンツも出力済として扱う。
→headerを出力した後、コンテンツを出力する前に、DBの処理を行う部分も
 あるため、不具合の原因になる。


set_error_handler() にて、PHPのWarningを捕まえるようにし、怒られたら
なんらかの処理を行う。
→怒られるのは コンテンツ出力後に headerを出力した場合であるため、
 その場合での対応は困難。
 また、DBモジュールのためにエラー処理まで手を付けるのは避けたい。


ob_start() をし、ob_get_length()にて出力サイズを得る。
→そもそも ob_start()をしている場合は画面出力をしていないので、出力サイズを
 得ることはできない。
 また、DBモジュールが画面の出力を操作するのは避けたい。


headers_sent()のように、コンテンツが出力済かどうかを得る方法があれば
解決なのですが、何かご存知の方はいらっしゃいませんか?

Cannot modify header information の Warning文中には、どこでコンテンツ出力が
開始されたのかが書かれているので、PHPの内部的には情報を持っているようです。


よろしくお願いします。

---
肥田昌也 ml @ shiftra.jp



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