電子書籍の厳選無料作品が豊富!

PHP4+PostgreSQLでプログラムを作成しています。
メモリ使用量の検証として、selectで全件検索をかけて、pg_fetch_resultを用いて順次ブラウザに出力し、都度memory_get_usageでメモリ使用量を確認したところ、単にHTMLを出力するだけでメモリの使用量が増え続けていたのですが、これは仕方がないことなのでしょうか。
例えば何か設定で回避することが可能であったりしますか?

A 回答 (3件)

どのくらいの使用量なのかわかりませんが、そんな巨大なHTMLを出力したら、見る方も大変なのでは?



mod_phpでApacheにContent-Lengthヘッダを出させていれば、
出力前にデータをため込んで、PHPからの出力が終了したらそのサイズを確認し、
Content-Lengthヘッダとして出力するので、バッファのため込みは避けられないと思います。(ため込まないとファイルサイズがわからない)

あらかじめファイルサイズがわかれば自分でContent-Lengthヘッダを出力すればよいですが、まず無理ですので、
header('Transfer-Encoding', 'chunked');
を使って見てはいかがでしょうか。
それでも使用メモリが減らないようなら、適当なタイミングでechoした内容(バッファ)を、クライアントに送信する処理が必要です。
Perlではflush()ですが、すみませんがPHPではわかりません。
頻繁にflushすると、パフォーマンスが落ちます。

CGI版PHP(mod_cgi)では、特に気にしなくてもTransfer-Encodingを使い、最適なタイミングでflushしていると思います。

*出力バッファがらみです。
一案として。

昔はContent-Transfer: chunkedに対応していないブラウザが多かったようですが、今は大丈夫だと思います。
Ajaxでは、iCab等、一部のブラウザでデータが取得できないかもしれませんが詳しく調べていません。(iCabはContent-Type: multipart/*を取得できませんので、それが原因かも知れません)
携帯電話ではContent-Length必須、Content-Transfer: chunked未対応です。

CGI関連はCGIカテゴリーで質問するともっと良い回答が得られるかもです。

ご参考まで。
    • good
    • 0
この回答へのお礼

ご丁寧なご回答ありがとうございます。
データを全件表示したいという要望があり試してみた次第です。
Transfer-Encodingをchunkedとしても動作は変わりませんでしたが、一定のタイミングでバッファをフラッシュしながら出力したところ、メモリ使用量が増え続けることなく全件の出力ができました。
また、その他の情報も大変参考になりました。

お礼日時:2007/12/19 12:12

単純にhttpのバッファに溜まりこんでいるだけじゃないですかね。



while($row = pg_fetch_assoc($pid))
{
 echo $row['data'] . "<br />\n";
 echo memory_get_usage();
 echo "<br />\n";
}

といった感じだと増え続けるのは道理かなぁとも思います。
巨大データをhttpで送信というのを当方はやったことないので分かりませんが、
対策としてはsocketを明示的に開き、こねくり回せばメモリ使用量も抑えられるのではという気がします。
// タイムアウトや遅延の設計も行わねばならないのでかなり面倒な気がしますが
もしくはHTTPのバッファをオンメモリでない方法で独自に管理とか。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
出力件数を制御してしまえば問題にならないことだったのですが、どうしても気になって質問してしまいました。
httpのバッファの問題とのことで、メモリ使用量が増えるのはやはり仕方がないということと理解しました。
*バッファを独自に管理することについては知識がありませんので調べてみます。

お礼日時:2007/12/18 14:54

それ、webアプリとしてapacheか何か経由で動かしてるの?


だとすればPHPをcliで駆動すれば増え続けるのは押さえられるんじゃないかな。

モジュールとしての駆動とcli駆動がどう違うのか調べると言ってる意味が判ると思うよ
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
PHPはapacheでCGIとして動かしいます。
CLIについては全く知識不足なのでこれから調べてみます。

お礼日時:2007/12/18 14:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!