標準出力(STDOUT)のクロスとオープンは?

[上に] [前に] [次に]
J.Naka 1999/12/06(月) 23:06:10
CGIで長い処理の前に一旦ページ表示さすため、標準出力を
close(STDOUT);
で掃き出させます。
その再度標準出力をオープンするときは、どのようにしたら良いのでしょうか?

ふじ 1999/12/07(火) 15:26:34
> close(STDOUT);
標準出力を閉じてしまうと、(httpd に依存するようですが)
ブラウザへの出力を終わらせてしまうようです。

ページを徐々に出力したいなら、Perlなら出力データを
バッファリングしないようにすればいいのでは。

$| = 1;
print "hogehoge\n";
sleep 5;
print "fugafuga\n";

こんな感じで。
#うまくいかない場合も(サーバによって?)あるようです。

あと、CGIとして動かすなら、ブラウザが表示できるように
書き出さないといけません。<TABLE> は閉じるとか。

とほほ 1999/12/08(水) 00:44:33
追加情報ですが、ブラウザへの逐次書き込みを実現するには、

(1) $1=1;で、perlの出力をバッファリングしないようにする。

の他に、

(2) NPHスクリプトを使用して、WWWサーバーがバッファリングしない
  ようにする。
  → http://www.tohoho-web.com/wwwcgi4.htm#NphScript

(3) Pragma: no-cacheヘッダを使用して、プロキシサーバーがバッファ
  リングしないようにする。
  → Content-typeヘッダの前に Pragma: no-cacheヘッダを追加する。

もやっておくと、逐次書き込みがうまくいく確率があがる・・・という
のがありました。

とほほ 1999/12/08(水) 00:47:57
量より質を・・・と言いながら、さっそく自分がやってしまいました。
 $1=1; は $|=1;
の誤りでした。ごめんなさい。(はずかしい。)

J.Naka 1999/12/08(水) 02:05:20
ども、ふじさん、毎度お世話なります。(_ _)
とほほさん、レス、ありがとさんです。

実は、ふじさんのレスを長めながら、回避方法をclose(STDOUT)とは別の方法でやらないと無理かなと別ロジックを色々思考中(試行ではないす)で、レスが遅れましてすいません。
 ページ出力の遅延防止(逐次書き込み)は、ふじさん、とほほさんの回答を参考にまた別のシチュエーションでやってみます。有り難う御座いました。
#すいませんです、質問文アップしたと同時に全く別の展開が見えたりする「あまじゃやく」な人でして<わたくし  (^^;

--------------------------------------
> $1=1; は $|=1;
>の誤りでした。ごめんなさい。
いえいえ実現方法への示唆としてだけでも充分です。
 回答を参考に実際にコーディングするときはマニュアルの該当箇所を見ますんで、簡単な間違いは全く問題ではありません。正解そのもの回答も嬉しいですが、正解への方向が見える事も好きだったりしますんで。

[上に] [前に] [次に]