ブラウザとCGIアプリの関係?!

このQ&Aのポイント
  • ブラウザとCGIアプリの関係について知りたいです。
  • WEBアプリでの処理実行時の流れや、ブラウザを閉じた場合のCGIアプリの処理について教えてください。
  • CGIアプリが処理を行う時間はブラウザを閉じるまでですが、途中で処理が終了することもあるのでしょうか?
回答を見る
  • ベストアンサー

ブラウザとCGIアプリの関係?!

なんとなく想像はできるものの、正しいかどうか確認させていただきたく 質問させていただきます。 WEBアプリですが、例えば 「ブラウザの処理実行ボタン」クリック→「CGIアプリ」→「結果表示」 のような流れだったとして、 処理実行ボタンをクリックしてすぐにブラウザを閉じた場合、CGIアプリはどこまで処理が行えるのでしょうか? ※CGIアプリの処理はブラウザを閉じるまでの時間よりは長いとした解釈でお願いします。 CGIアプリがreturnで抜けるまで、ブラウザはなくても処理は行ってから終了。 また、 returnの前にブラウザに出力していたら、(ブラウザは無いわけで)returnの前にCGIアプリは終了してしまう。→処理途中で終わってしまうことがありえる よろしくお願いします。 わかりづらかったら、申し訳ありません。

  • jg1wjz
  • お礼率91% (148/162)
  • CGI
  • 回答数5
  • ありがとう数8

質問者が選んだベストアンサー

  • ベストアンサー
  • angel2015
  • ベストアンサー率21% (126/590)
回答No.5

>入力→DBオープン→処理→処理・・・→出力→後処理・DBクローズ→return ユーザーに求める動作がないなら 出力より先に後処理とDBクローズをしたほうが良いですね 不具合の原因になります

jg1wjz
質問者

お礼

angel2015 さん、 やはり、この順番は不具合の原因、、、 ブラウザを閉じると、printf() が異常となり、CGIプログラムは  終了してしまう、、、 そんな気がしますよね。 次回、カスタマイズまたは開発時には気をつけたいと思います。 ありがとうごさいました。

その他の回答 (4)

  • angel2015
  • ベストアンサー率21% (126/590)
回答No.4

>また1行出力して、、、など繰り返しても最後まで動くのでしょうか? ブラウザがなくなっていても。 アプリの言語によるところが大きいです 言語によっては常にブラウザを開いていないと動作しないようにプログラムされています 厳密に言えばperlでもブラウザと常に相互通信していないと中断するようにはできます しかし一般的なperlでは、ブラウザの状態を無視して処理を行います なんでこの場合、言語を特定して質問しないと回答もばらばらになります 他の回答を見たらc++となっていたので、リアルタイムに動くものなら ブラウザから応答がない場合処理が中断するなどの対応をアプリに組み込んでいるかどうかですね

jg1wjz
質問者

お礼

angel2015 さん、ありがとうございます。 #他の回答を見たらc++となっていたので、リアルタイムに動くものなら #ブラウザから応答がない場合処理が中断するなどの対応をアプリに #組み込んでいるかどうかですね CGIプログラムは一応、入力から出力まで、一気に(!)必要な処理をしてreturnしているだけで、ブラウザの状態は無視しています。 入力→DBオープン→処理→処理・・・→出力→後処理・DBクローズ→return みたいになっています。 で、出力のところでログが止まっていました。 他のログは全て後処理までログが残っています。 一箇所だけ、後処理ログが無く、、、 想像ですが、出力(printf())のところでログが止まっているので もしかして、ここでブラウザが閉じられたのでは? と思い、 ホントのところ、CGIプログラムはブラウザが閉じられたらどこまで動くのか、確認したく質問させていただきました。 ・・・ということは、 最後まで動くということでしょうか???

  • t_ohta
  • ベストアンサー率38% (5085/13290)
回答No.3

> サーバ側の環境設定って、どこを調べたらいいでしょうか? httpd、CGIプログラムの言語は、それぞれ何をお使いでしょうか?

jg1wjz
質問者

お礼

t_ohta さん、 WEBサーバーは、IIS7.0(WindowsServer2012 R2)、 言語は、c++になります。

  • t_ohta
  • ベストアンサー率38% (5085/13290)
回答No.2

サーバ側の環境設定によっては、httpのセッションが切れた時点で処理が中断される場合もあるし、一通り処理が終わるまで継続される場合もあります。

jg1wjz
質問者

お礼

t_ohta さん、ありがとうございます。 サーバ側の環境設定って、どこを調べたらいいでしょうか? CGIアプリのログを見ますと、画面に出力しているところで切れています。 後処理のログが無いのです。 その原因を調べているのですが、ブラウザ右上の「×」をクリックすると こういうこともあるのかな、、、と思いまして。 サーバ側の環境設定で、それを防げれば、、、と思いまして。 よろしくお願いします。

  • angel2015
  • ベストアンサー率21% (126/590)
回答No.1

一般的なCGIはperlだと思いますのでperlだとして回答します perlは入力(閲覧)が来たら出力(情報)を返すだけです 返却先がブラウザを閉じていても関係ありません また、それがサーバー上のデータを書き換えるものならブラウザを閉じてもデータは書き換わっています

jg1wjz
質問者

お礼

angel2015 さん、有難うございます。 確かお礼コメントを入れたはずなのに、今見たら、、、無い! ので 内容変更して再度書き込ませていただきます。 Perlだとして、(すみません、perlわかりませんが) 処理の途中で1行だけ出力して、その後 またの処理をして、 また1行出力して、、、など繰り返しても最後まで動くのでしょうか? ブラウザがなくなっていても。 そんな作り方はしない・・なんていう回答は無しでお願いします。(^^;

関連するQ&A

  • CGIアプリ(一般的なこと)

    お世話になります。 頭が混乱してしまったので確認させてください。 ブラウザ上のボタンを押して、CGIアプリを実行する場合 例えばCGIアプリをabc.exeとすると abc.exeのmail処理からreturnまで処理される、 (returnの直前でブラウザに結果を出力) と、いうことで合ってますか? abc.exeの処理時間が長くても最後のreturnまで処理されますよね? cgiのタイムアウトまではいかないこととしてください。 その長い処理の間にブラウザを閉じてしまってもabc.exeは処理をし、 結果出力でエラーですよね。ブラウザは閉じられているので。 エラーについては置いときまして(^^;) mainの後とreturnの前にLOG出力させているのですが、数が合わないのです。 実際はmailの後にDB.openしているので「open」、 returnの前にDB.closeしているので「close」のようにLOGを書いています。 open-closeはペアだと思うのですが、openが多くてcloseが少ない。 これは単純にLOGに書けなかっただけでしょうか? どういう時にそのようなことが起きるのでしょうか? これは「画面が固まったのでブラウザを閉じて操作をやり直した」との申告でLOG解析をした結果です。 LOGでは固まったということは解析できなかったのですが、 確かに open、open と続いてたりしてました。 ちなみに一人だけで操作しているときです。 しばらくぶりにWebCGIの解析で、一般的な動きが...???混乱してます。 どなたか、アドバイスをお願いいたします。

    • ベストアンサー
    • CGI
  • OSとアプリとユーザの関係教えてください。

    プログラミングをしていて気になったのですが、ボタンのダブルクリックしてそこに命令文をちょろちょろと書けば、ボタンがクリックされたときにその命令が実行されますが、これってどのような仕組みなのでしょうか? ユーザとOSとそのアプリの関係を教えてください。 自分なりに調べてこうかなーと思うのは、以下のとおりです。 ユーザがボタンをマウスでクリック ->OS(Windows)がそれを理解して? ->アプリに伝える ->アプリはボタンがクリックされたときのイベントのところをみにいってそこにかかれている命令文を実行する WM(ウインドウメッセージ)がどこの段階でどこからどこへ投げられているのかいまいちよくわかりませんでした。 ボタンが押されてから、イベント処理がなされるまでの詳細な流れ(メッセージのやり取りや受け手の処理)を是非、教えていただけないでしょうか?

  • CGIからのプログラム起動

    現在Web上のボタンを押したときにCGIから別プログラムを起動する処理を作成しています。 処理の流れ ボタン押下→AAA.CGIが実行→BBB.sh(cshプログラム)→CCC.pl→DDD BBB.shは"unlimit datasize"を指定してCCC.plを実行しているだけです。 CCC.plは"exec"でプログラムDDDを起動 しかし上記のように処理を行うとプログラムDDDの実行結果がエラーとなってしまいます。 そこで試しにコンソール上からBBB.shを直接実行してみたのですがこのときはプログラムDDDの実行結果は正常に終了しました。 またプログラムDDDを直接実行した場合も正常に終了しました。 CGIからシェルやperlを実行するのと直接実行するのとでどういう違いがあるかアドバイスをお願いします。 原因が全く分からない状態で手詰まり状態なので手がかりになることでしたらなんでもアドバイス願います。

    • 締切済み
    • CGI
  • close(STDOUT)するとCGIが終了する。

    Windows2000+Apache2.2+ActivePerlでCGIを作っています。 CGIで時間のかかる処理を行いたいので、以下のような処理を行いました。 print "Content-type: ~ ~ブラウザに返す文字列を標準出力へ~ close(STDOUT); ~時間のかかる処理~ ところが、「時間のかかる処理」の部分は実行されず、どうやらSTDOUTをクローズしたことにより、 ApacheによってCGIが終了させられてしまうようです。 ネットなどで見るかぎり、UNIX系のサーバーではよく行われる方法のようなのですが、Windowsでの実装になにか違いがあるのでしょうか? また、Windowsサーバーでこのようにブラウザに処理を戻しつつ、時間のかかる処理を行いたい場合にはどうすればよいのでしょうか?

    • ベストアンサー
    • CGI
  • [CGI]ブラウザを閉じた時の動作

    PerlでCGIを作成中、ふと疑問に思ったことがあるので質問します。 例えばCGIで重い処理、またはsleep等の時間がかかる処理が走ったとします。 この際、処理中にブラウザを閉じる、または別のサイトに移動する等を行った場合、処理は中断されるのでしょうか?それともサーバサイドで最後まで実行されるのでしょうか? 基本的な質問かもしれませんが、よろしくお願いします。

  • JavaScriptからCGIを読み出す方法

    お世話になっています。 今回、JavaScriptからCGIで読み出した文章を出力する方法についての質問があり、 投稿させて頂きました。 まず、CGIで、例えばa.logというファイルを読み出し、ブラウザに出力する処理を書きます。 a.logファイルは全て文字列です。 次にHTML側で、適当にaタグでリンクを張ります。 このリンクをクリックすると、そのCGIが読み出した文章を特定の場所に出力する、 という処理をしたいのですが、うまく出来ません。 探していると、インラインフレームを使えばいいとよく見かけるのですが、 その方法は取りたくないのです。(サイトのデザインの関係上) 試したソースは、JavaScriptでファンクションの定義をし、 実行されれば以下のようなソースを出力する、というものでした。 <script language="JavaScript" src="read.cgi"></script> 自分でも無理があるな、とは思ってますが、これ意外思いつかなかったもので・・・ 皆様のお知恵をお貸しください。 お願いします。

  • マルチスレッド絡み?マルチなサーバ処理をリアルタイムにブラウザに返す方法が…

    C++自体は割りとやってますが、マルチスレッド、通信、JavaScriptは初心者からの質問させて頂きます。 うまく伝わるかどうか心配なのですが、 要は以下のような処理イメージです。 -- ブラウザ上で、[開始]ボタンを押したら、サーバー上で処理1が実行されます。 その後、ブラウザ上では「処理1実行中」と表示されます。 その間、更にもう一度[開始]ボタンを押すと、サーバ上で処理1と同じ処理が処理2として実行されます。 処理1、処理2それぞれ処理が終わると、終わったものからブラウザ上に「完了」と表示されます。 -- 伝わりますでしょうか? このような処理で、特に分からないポイントがあります。 サーバで処理を実行開始した時点で、一度ブラウザに応答しておいて、処理を返し、処理が終了した時点で再度ブラウザに完了を通知する方法です。 ブラウザから処理されるアプリはサーバアプリ一つだと思うし、そこからマルチスレッドでは?と考えると、終わるまで処理を返せないのかなと。。。 (アホな文章になってそう。。。) 図にすると以下のようになるでしょうか? ブラウザ - サーバアプリ間はJavaScript サーバアプリ - 処理1(処理2)はC++です。 サーバアプリと処理1(処理2)は同じExe内でできるのならそれでも可です。 -- ユーザー(ブラウザ)    ↓ ↑ サーバアプリ(C/C++)  ↓  ↓  ↓ 処理1 処理2 処理3(C/C++) なるべく定期的に監視するようなタイマーとか使わないで実現可能にしたいです。 どなたかアドバイスお願いします!!

  • OpenCVはCGIで使用できるのでしょうか

    普段、Visual C++でOpenCVを使い、Windowsのネイティブアプリを作る勉強をしています。 しかし今回、web上にてOpenCVの画像処理を用いたプログラムを動かさなければいけなくなりました。 なのですが私はwebに関して全くの素人で、色々調べた所CGIというもので出来そうだと分かりました。 C++とOpenCVを使ってCGIを作り、それをサーバに置くことでネイティブアプリと同じように動かせるのでしょうか? 例えば、クライアントがブラウザから画像をアップロードし、それにCGI(C++とOpenCV)で何らかの画像加工を行って、その結果をブラウザに返して表示するということは出来るのでしょうか。 また、出来るとすれば、クライアント側のPCにOpenCVがインストールされていなくても使えるのでしょうか。 どうぞよろしくお願いします。

  • CGIでCreateProcess

    vc++でCGIアプリケーションを作成しています。 今回、画面よりボタンクリックされたら、 CreateProcessで某exeを起動することになりました。 が、そのexeは処理時間がかかるため、終了を待たないで 画面出力をしたいのです。 単純に CreateProcessがうまくいったら、GetExitCodeProcesで「終わったか」を チェックしないで画面を出力しています。 が、画面出力が全部終わりません。 画面(html)はトップから出力し、iframeがあります。 表示の最後(</html>の前)にiframe内に一覧リストを表示させるよう、 JavaScriptでリクエストを行っています。 ログを見るとトップの出力までは書かれています。 その後、CreateProcessで起動したexeが終了すると、 一覧リストは表示されます。 ログも追加されています。 ##例えばexeが5分かかるとすると5分後にログが最後まで書かれています) ##画面も5分後に一覧リストが表示されます。 何故、一覧リストの処理が待たされているのかわかりません。 ソースはこんな感じです。   ↓ iRet = CreateProcess(0, Pbuff(ここにexe名), 0, 0, TRUE, 0, 0, 0, &startUpInfo, &PInfo ); if ( iRet != TRUE ){ CgiError("xxx", "起動できませんでした", "" ) ; return(-1); }  //この後画面表示処理 何か設定とか、間違ってますでしょうか? または何か他にしなければならないことがあるでしょうか? アドバイスをお願いいたします! 因みに、CreateProcessで起動するexeは最大2時間程度の処理時間になります。 よろしくお願いします。

  • CGIの起動が遅い

    Web上から作成したCGIを起動した場合に、そのCGIが存在するサーバ上ではすぐに実行されるのですが、他のPCからサーバにアクセスしてCGIを起動するとブラウザの下部にCGI実行中のメッセージが表示されてから結果が表示されるまでに時間がかかっています。(約30-60秒) 他のネットワーク処理等は普通に実行できるので特にネットワークが重い等の問題はないと思うのですが何が問題なのかアドバイスをお願いします。 サーバOSはRedHat Linux 5.1、apacheはver2.2です。

    • 締切済み
    • CGI