アプリ版:「スタンプのみでお礼する」機能のリリースについて

Windows2000+Apache2.2+ActivePerlでCGIを作っています。
CGIで時間のかかる処理を行いたいので、以下のような処理を行いました。


print "Content-type: ~
~ブラウザに返す文字列を標準出力へ~
close(STDOUT);
~時間のかかる処理~

ところが、「時間のかかる処理」の部分は実行されず、どうやらSTDOUTをクローズしたことにより、
ApacheによってCGIが終了させられてしまうようです。

ネットなどで見るかぎり、UNIX系のサーバーではよく行われる方法のようなのですが、Windowsでの実装になにか違いがあるのでしょうか?

また、Windowsサーバーでこのようにブラウザに処理を戻しつつ、時間のかかる処理を行いたい場合にはどうすればよいのでしょうか?

A 回答 (2件)

>ネットなどで見るかぎり、UNIX系のサーバーではよく行われる方法のようなのですが、Windowsでの実装になにか違いがあるのでしょうか?



検索したら、こういうことらしいです。ビルド環境の違いのようですね。

CGIの動作について
http://chaichan.web.infoseek.co.jp/qa3000/qa3198 …
suEXEC サポート
http://httpd.apache.org/docs/2.2/ja/suexec.html

>また、Windowsサーバーでこのようにブラウザに処理を戻しつつ、時間のかかる処理を行いたい場合にはどうすればよいのでしょうか?

こちらは、他の方にお願いします。
    • good
    • 0

> ネットなどで見るかぎり、UNIX系のサーバーではよく行われる方法のようなのですが、


> Windowsでの実装になにか違いがあるのでしょうか?

Apacheのソースコードを見てみました。Linuxでは Unix 独自のコード部分でepoll を
使ってディスクリプタの監視をしているようです。ただ、Windows には同じAPI はない
ようで、別の実装がされているように見えました。

少なくとも、mod_cgi.cの中で、Windows 環境ではAPR_FILES_AS_SOCKETSが
定義されないのでこの部分で分岐が行われます。

------
#if APR_FILES_AS_SOCKETS
apr_file_pipe_timeout_set(script_in, 0);
apr_file_pipe_timeout_set(script_err, 0);

b = cgi_bucket_create(r, script_in, script_err, c->bucket_alloc);
#else
b = apr_bucket_pipe_create(script_in, c->bucket_alloc);
#endif
------
    • good
    • 0

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