WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:セッションについて

0:[投稿] popo [2002/08/14 18:14 ][環境:WIN+IE UNIX系+Java]

確認したいことがあります。

セッションについてですが、セッションが確立したあと、ブラウザを閉じると、セッションは消えますよね?
また、その時実行されていたスクリプトは実行取り消しになるのでしょうか?

今まで、セッションが解ければ、処理は中断すると思い込んでいたので、確認したいのです。(もし、serverに不可がかかると問題なので・・・・)


1:[回答] ナン [2002/08/16 11:15 ]

HttpSessionクラスを使用した場合は、自動的にタイムアウトされ、セッションは破棄されるようです。
尚、タイムアウトの時間はサーブレットコンテナで設定するようです。

つまり、
>ブラウザを閉じると、セッションは消えますよね?
>その時実行されていたスクリプトは実行取り消しになるのでしょうか?

Yesみたいです。

ちなみに、『初体験Javaサーブレット』の本から参照。(初心者なもので...)


2:[回答] しなのむし [2002/08/18 00:01 ]

>ブラウザを閉じると、セッションは消えますよね?
>その時実行されていたスクリプトは実行取り消しになるのでしょうか?

Noでしょう。

ちなみにクライアント側に保存されているセッションIDが消えても
サーバ側に保存されているセッション情報が破棄されるのは
タイムアウトやログアウト機能等なんらか明示的な方法で
それが行われるタイミングです。


3:[回答] popo [2002/08/19 11:33 ]

ナン様、しなのむし様ご回答ありがとうございました。

タイムアウトで、"サーバ側のタスクが取り消しになる"ということですよね。ログアウト機能に関しては、操作する人によりけりなので、余りログアウトボタンを作りたく無いのです。作っても、Xボタンを押す人が大半だと思うし、期待できないので・・・・

そうするとタイムアウトでいかにサーバに負荷を掛けないかということですかね。

調べたところ、タイムアウトの時間を短くするっていうのが、一つの方法みたいなのですが、時間を何分にすればいいのかとかは、経験なのですかね。(ま、使用目的にも関係あると思うし、取りあえず私は3分にしたのですが)

他の人は、セッション時、Xボタンを押された処理はどのようにしているのでしょうか?
私みたいに、タイムアウトを利用して、設定を短くしているのでしょうか?因みにIISのASPの時のデフォルトは20分位みたいなのですが、これでは、大勢が処理途中でXボタンを押したらサーバがダウンしてしまうと思うのですが・・・・



4:[回答] やじうま1号 [2002/08/19 11:57 ]

>>3
サーバーは保存して処理してデーターを送るだけなので、送り先がどうなろうが、処理は続きますし、届かなくたって平気です。

詳しくは
http://www.itboost.co.jp/php/php_12.php
を御覧になると良いと思います


5:[回答] しなのむし [2002/08/19 12:47 ]

>タイムアウトで、"サーバ側のタスクが取り消しになる"ということですよね。

繰り返しとなりますがそういったことはありません。
答えは "No" です。
基本的には「セッションの期限切れ」と「処理の中断」は
まったく関係ないです。

処理の中断にこだわっておられるようですが

- 処理ってそんなに長いの?
- 途中で処理を中断してデータはおかしくならないの?

等の疑問があります。

もしかしてロールバックさせたいのでしょうか?


6:[回答] popo [2002/08/19 14:36 ]

やじうま1号さま、しなのむしさまありがとうございました。

しなのむしさま。大変すみません。私の方が、理解しきれていないところが数多くあり、ご迷惑をおかけしました。

セッションとサーバの処理は関係が無いということはわかりました。で、知りたい部分が違っていたみたいで、質問の仕方が悪かったと思います。

実行ボタンを押してサーバで処理をしている時に、ブラウザーを閉じてしまった場合、サーバ側の処理はどのようになるのか?という事が知りたかったのです。
たとえば、検索をしている時ブラウザーを閉じる。(もちろん結果が返ってきていない)と、リクエストの結果をサーバはどのようにするのか?ということです。HTTP(余り知らないので間違っているかも)でリクエストを返し、送り先がない時は、データは消滅(破棄)するのか?
リスポンスが悪い時は、Xを押して作業をとめてしまった時、サーバ側では、どのようになるのか?ということが知りたいのです。

> 処理ってそんなに長いの?
上記の返答に関係してくるのかも知れません。処理が長い。のと、リスポンスが悪いのです。

いま、いろいろ調べながら、質問しているのですが、サーバのどの部分を調べたらよいのか?、それとも、IISを調べたらよいのか、ASP、を調べたら良いのか、ちょっと困ってて、それで、質問が狂っていることに関してはお詫びいたします。


7:[回答] 流れ者 [2002/08/19 15:05 ]

とりあえずHTTPプロトコルを勉強すると良いでしょう。
処理中の中断についての具体的な動作は、サーバーアプリケーションに
依存します。

この質問は、OSのプロセス間通信からHTTPプロトコル、ネットワーク
プログラミングにも関わっているので詳細は割愛します。

perlでのCGIの場合ならばシグナルハンドラをトラップします。


8:[回答] しなのむし [2002/08/19 21:46 ]

IIS、ASPはよくわかりませんが
以下の設定あたりでしょうか?

AspScriptTimeout
http://www.microsoft.com/japan/developer/library/jpiis/iishelp/iis/asp/apro1cmt.htm

ScriptTimeout
http://www.microsoft.com/japan/developer/library/jpiis/iishelp/iis/asp/vbob246s.htm

# サーバー負荷が著しいようなプログラムを書かないのが一番ではないかと思いますが。


9:[回答] しなのむし [2002/08/19 22:11 ]

続き

>送り先がない時は、データは消滅(破棄)するのか?
送り先がない時は結果データは送られないでしょう。
(書込み処理等は行われてしまいますよ。)

>リスポンスが悪い時は、Xを押して作業をとめてしまった時、サーバ側では、どのようになるのか?
「Xを押す」が何をするかはpopoさん次第です。

スクリプト -> データベース -> スクリプト
という処理の場合はデータベースのタイムアウトも考えないと駄目かな。。。
http://www.microsoft.com/japan/developer/library/jpiis/iishelp/iis/asp/vbob246s.htm
> サーバー コンポーネントの処理時間は、タイムアウトの対象にはなりません。
と書いてあるし。


10:[回答] popo [2002/08/20 09:25 ]

流れ者さま、しなのむしさまありがとうございます。

流れ者さま、私は経験等が無い分(他人が聞いたら言い訳かもしれない)、HTTPを余り気にしないで作成していたのですが、今後のことも考えて参考書等を見て少しずつ経験にしていきたいと思います。

しなのむしさま今回は大変お世話になりました。

>サーバー負荷が著しいようなプログラムを書かないのが一番ではないかと思いますが。
確かにソース事態は汚いと思いますが、サーバが止まる程のソースでは無いと思うのです。それに、今回は特殊な言語(一般的に使われない)を使っているため、マニュアルも余り無く、ASP等の概念を参考にしながらの作成となっているし、また、自分が経験の足りなさで、調べきれていない部分が数多くあるために、いろいろ調べている最中なのです。(SEに説明しきれないところもあっては、困るので、設計が悪いともいえないし (^^;)
で、問題となり、これからも疑問になっていくと思われるこの件に関しては調べておかないと思いいろいろ見ているのでが、余りに無知なため、今回このような質問になってしまいました。"私もこんなにサーバに負荷がかかると思っていなかった。"

しなのむし様には、ご丁寧にいろいろご迷惑おかけして、またこのような質問に対して、いろいろ感謝しています。


11:[完了] popo [2002/08/20 09:26 ]

完了 

リスポンスではなくレスポンスでした。


12:[完了] popo [2002/08/20 09:30 ]

説明不十分

Xを押すはブラウザーの右上にある終了のXです。


13:[回答] しなのむし [2002/08/20 13:21 ]

>Xを押すはブラウザーの右上にある終了のXです。

了解しました。

考えてみると結果データが表示される前にXを押しても
処理は最後までいってしまいますが
結果データを送らない分は負荷が少なくなるかもしれません。
(たぶん(^^;)


14:[回答] TOM neko [2002/08/20 14:55 ]

>>13
>処理は最後までいってしまいますが
Javaservletの場合はPerlと違って、サーバがプログラム(スレッド)を止めたりしないって事ですね?

通常のPerlでは、ブラウザのキャンセルを受けて、Webサーバがプロセスを止めにかかりますから(kill)、>>7の言うようにシグナルトラップしないと処理がいきなり中断してしまいますが。


15:[回答] TOM neko [2002/08/20 15:33 ]

>>14
PerlというかCGIね。


16:[回答] しなのむし [2002/08/20 16:03 ]

>通常のPerlでは、ブラウザのキャンセルを受けて、Webサーバがプロセスを止めにかかりますから

10秒程度の時間の掛かる処理の後、ファイルにデータを書き出して
終了するPerlスクリプトを作り、処理中に

1.ブラウザをXで閉じる
2.ブラウザの中止ボタンを押す

を試してみましたが、いずれの場合もデータは書き出されておりました。

確認:NC4.79、IE5.5


17:[回答] しなのむし [2002/08/20 16:10 ]

>>16
サーバはLinux+Apacheです。


18:[回答] 実験くん [2002/08/20 17:13 ]

面白いので実験しました。
UAは、IE5.0とNC4.7。

Linux+Apache1.3.3 ちと古いか・・・
中断時には書き込みされませんでした。

WinNT+Apache1.3.12
UAの表示上中断しているにもかかわらず、ファイルは最後まで
書き込まれていました。つまりプロセスは裏で動作していました。

実験ソース
#!/usr/local/bin/perl
$|=1;

print qq(Content-Type: text/plain\n\n);
print qq(Now Looping !!\n);

open(OUT, ">out.dat") || die "Open Error\n";
for($i=0;$i<10;$i++){
$put_buf = qq(Loop=$i\n);
print OUT $put_buf;
print $put_buf;
sleep 1;
}
close(OUT);
__END__

その他の組み合わせの結果を知りたいです。
Linux版のApacheはどの辺のバージョンから動作が違うのだろう?


19:[回答] popo [2002/08/20 17:28 ]

いろいろ記入されているので、報告

perlでは無いのですが、IIS5.0でも似たように裏で動作していました。(しかし、私のはパーケージによるものかも知れません。)


20:[回答] popo [2002/08/20 17:29 ]

上記訂正

IIS5.0でも > IIS5.0を使ったサーバでも


21:[回答] popo [2002/08/20 17:33 ]

windows2000server + IIS5.0


22:[回答] TOM neko [2002/08/20 19:49 ]

>>18 のソースで実験してみました。Mac OS XのApache1.3.26で書き込みキャンセルされます。
なぜかバッファが利いてて、書き込まれないか全部書き込まれるかどちらかです。

1次情報では無いのですが、
http://tohoho.wakusei.ne.jp/lng/199812/98120092.htm
http://www.nishimoto-site.net/archiver/ML/apache-ML/199805/msg00018.html
セッションが切れている時に出力しようとするとSIGPIPEが来るようですね。
ということは、プログラム最後に出力するならそこまで裏で進む事になりますね。
逆に時間がかかりそうなプログラムなら、少しずつ出力するようにした方が止まる機会が増えるわけです。


23:[回答] しなのむし [2002/08/20 20:02 ]

>>18
>>22

http://x68000.startshop.co.jp/~68user/webcgi/lock.html#6
http://x68000.startshop.co.jp/~68user/net/http-proxy.html
より引用

>サーバからのレスポンスをブラウザに渡そうと print したが、
>それより前にブラウザの中止ボタンが押されていた、というときに SIGPIPE が飛んでくる。
>SIGPIPE というのは、出力先のプロセスが存在しない場合に送られてくるプロセスです。
>また、パイプ宛に出力しているときにブラウザが読み込みを中断すると、
>SIGTERM が送られてくることがあります。
>SIGPIPE も SIGTERM も、受けたプロセスは強制的に終了させられてしまいます。

>>18
>Linux+Apache1.3.3 ちと古いか・・・
>中断時には書き込みされませんでした。

1.長い処理
2.ファイルにデータ書出し
(この間ブラウザには一切 printしない、念の為sleepも使わない)
3.ブラウザに結果をprint

といった感じのプログラムでやってみるとどうなりますか?


http://www.bio.rcast.u-tokyo.ac.jp/~taro/tips.html#timeout
より引用

>サーバの対応
>CGI スクリプトの出力を受けとってクライアントに送信するときにのみ、
>送信不可からクライアントとの接続の切断を感知できる。
>クライアント側から TCP 接続を切断しても、そのこと自体はサーバは感知しない。
>クライアントとの切断を送信不可能であることから感知すると、 CGI スクリプトを殺しにかかる

ブラウザを落としたくらいで書込み処理が中断されたら
データがすぐにぐちゃぐちゃになってしまうと思われ。。。(^^;


24:[回答] しなのむし [2002/08/20 20:15 ]

結局、popoさんが考えておられた
Xボタンを押して処理中断というのは
検索用途なら
>>18
みたいに書けば実装出来るわけですね。
勉強になりました。


25:[回答] TOM neko [2002/08/20 20:17 ]

>>23
>ブラウザを落としたくらいで書込み処理が中断されたら
>データがすぐにぐちゃぐちゃになってしまうと思われ。。。(^^;

そう。だからファイル処理と出力が交互にあるようなプログラムならシグナルトラップが必須ですね。

Javaservletはどうなんでしょう?


26:[回答] TOM neko [2002/08/20 23:16 ]

>>25
Javaはさっぱり分かりませんが、JavaservletはCGIと違って個々のアクセスに対してプロセスでは無くスレッドで応じるようですね。ですからkillと違う何かが来るのかなと思ったら、
http://www.geocrawler.com/archives/3/193/2000/1/0/3196783/
(英語ですが) 出力時にIOExceptionてのが来るって? それであれこれすればなんとかなるのかな?


27:[回答] 実験くん [2002/08/21 03:27 ]

>>22
>>23
なるほど〜

>1.長い処理
>2.ファイルにデータ書出し
>(この間ブラウザには一切 printしない、念の為sleepも使わない)
>3.ブラウザに結果をprint
だと確かに確認できました。


>>25
>そう。だからファイル処理と出力が交互にあるようなプログラムならシグナルトラップが必須ですね。
確かに


http://www.geocities.co.jp/SiliconValley/6071/technic/58.html
この辺参考になります?>popoさん


28:[完了] popo [2002/08/21 10:46 ]

しなのむしさん、TOM nekoさん、実験くん、皆さんありがとうございました。

UNIXではシグナルを送っているということから、
Apacheの時は、SIGPIPEが発生してしまうのですね。
だとしたら、検索程度なら、SIGPIPEを発生させた方が良いということですかね。サーバに必要以上の負荷がかからない。(”スクリプト的には検索作業後、表示”で作成した時、LOCKが無い時)
もちろん、データ書き込み等はSIGPIPEを発生するとまずいですが・・・・。なんかLINUXがサーバがダウンしにくい要素もここらにあるのかな。(独り言)

windowsOSに関しては、シグナルを送っていないってことですかね。
IIS等ブラウザ(出力先)に無反応で処理を続ける。う〜ん、ここは調べないとわからないですね。 ある程度調べないと、下手にBBSに乗せられない。

LINUX+Apacheの時は、対処方法が理解できました。

皆さんのパワフルさに、脱帽です。
今回とても参考になりました。(感動してます。)

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World