Perlで、ページを表示した後に処理するには

[上に] [前に] [次に]
NAZOの人 1999/09/15(水) 14:56:35
ちょっと質問があります。

普通、Perlでcgiを作ると、
-----------------------------------------
print "表\示する文字";
#ココに処理を書く
-----------------------------------------
こういう風にかいても、処理がすべて終わってからブラウザは文字を表示します。
時間がかかる処理だと、しばらく待たされることになります

これを、すべて表示させてから処理を行いたいのですが、どうやったらできるのでしょうか?

誰か教えてください。

J.Naka 1999/09/15(水) 15:55:12
□便乗質問(^^;

 UNIXにしろWin9xにしろOSそのものはマルチタスクですが、その上で動作するPerlは、どの程度のマルチタスク能力があるのでしょうか?
 できれば、UnixとWin各々の差も知りたいです。

#CGI通すと処理の長さだけプラウザへの反応が遅くなるんだよね。
ちなみに、InterQサーバー(unix)は、処理なしのCGIでも2秒くらい無レスポンレスです。(^^;

kala 1999/09/15(水) 15:57:12
http://www.tohoho-web.com/lng/199802/98020500.htm
これのことでしょうか。

B-Cus 1999/09/15(水) 16:35:24
 print "表\示する文字";
 close(STDOUT);
 #ココに処理を書く
とか。

ふじ 1999/09/16(木) 04:05:34
どうもhttpdの・ソ装によるようなのですが、

print "hoge\n";
close STDOUT;
sleep 10;

とした場合、Apache1.3.6(Win32)は print , close の時点では出力しないようです。
#10秒待った後に表・される。

AnHTTPD1.18では、close STDOUT の時点で出力します。
#表・された後、10秒間ブラウザが読み込み中になる。

ただ、AnHTTPDの場合でも、
print "hoge";
というように、 \n を出力しない場合はダメ。
#これは Perl 側でバッファがクリアされないからでしょう。

Perl では
$| = 1
としても、次の print が・ソ行されるまではバッファリングされる
ようなので(青ラクダ本による)、バッファ9、バッファリングされたくなければ
print の最後に \n を付ける。
#それに加えて HTTPD の・ソ装に期待する。
ということになるでしょうか?
#間違ってたら御指摘下さ%

ふじ 1999/09/16(木) 04:10:49
ごめんなさい。化けちゃったみたいなので再投稿。

----
どうもhttpdの実装によるようなのですが、

print "hoge\n";
close STDOUT;
sleep 10;

とした場合、Apache1.3.6(Win32)は print , close の時点では出力しないようです。
#10秒待った後に表示される。

AnHTTPD1.18では、close STDOUT の時点で出力します。
#表示された後、10秒間ブラウザが読み込み中になる。

ただ、AnHTTPDの場合でも、
print "hoge";
というように、 \n を出力しない場合はダメ。
#これは Perl 側でバッファがクリアされないからでしょう。

Perl では
$| = 1
としても、次の print が実行されるまではバッファリングされる
ようなので(青ラクダ本による)、バッファリングされたくなければ
print の最後に \n を付ける。
#それに加えて HTTPD の実装に期待する。
ということになるでしょうか?
#間違ってたら御指摘下さいませ。

B-Cus 1999/09/16(木) 05:10:30
> ごめんなさい。化けちゃったみたいなので再投稿。
ところで、何で化けちゃったんでしょうか?

ふじ 1999/09/16(木) 16:08:00
>ところで、何で化けちゃったんでしょうか?
Vine Linux + NN 4.08 で投稿したんですが。
(再投稿は Windows + NC4.6)

どうも「表」が化けているので、SJISの2バイト目に
\ が入る場合の処理(Netscape 側の)に問題があるのかも?
#でも何で「実」も化けるんだろう?

NAZOの人 1999/09/17(金) 20:12:33
みなさん、私の質問に答えてくださって、ありがとうございます。

バッファリングなしと「close STDOUT;」を使ってやってみることにします。

ちょっと思いついたのですが、処理部分を他のファイルに書いて、それを実行する…
という方法ではできないのでしょうか?
うまく、もう1つのファイルを違うプロセスで実行できればいいのですが…

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