2016-09-10 5 views
0

C++で書かれたCGIスクリプトは、スケジューリング型の問題を強引に評価する比較的簡単なループを実行します。パラメータはデータベースから収集され、CGIスクリプトはPOSTリクエストのパラメータを渡すXMLHttpRequestを使用してJavaScriptでWebブラウザから呼び出されます。これは正常に動作します。しかし時には時間がかかりすぎることもあり、スクリプト実行中にブラウザのボタンをクリックしてスクリプトを中止できるようにしたいと考えています。C++で書かれた長時間実行されるCGIスクリプトをAJAXリクエストでクライアントから中止する

私はCGIスクリプトの内部から少しのファイルをポーリングすることに頼っていました。ファイルには '0'または '1'のいずれかを含めることができ、スクリプトが中止する必要があることを示します。これも機能します。しかし、ファイルI/O自体は比較的時間がかかっていますが、これをよりエレガントにする方法があるのでしょうか?私は4,500万回の繰り返しごとにしかチェックできません。それ以外の場合は問題にぶつかります。私はそれで生きることができますが、私は環境変数でそれをやり遂げることができるのだろうか?

ありがとうございました!

+0

プロセスを開始するapiを持っている場合は、プロセスを停止するためにもう1つだけ書く必要はありません。もちろん、開始リクエストを処理しているサーバーにアクセスできると仮定しています。 –

+0

@JibiAbraham [CGI](https://en.wikipedia。org/wiki/Common_Gateway_Interface) - 既に書かれ標準化されており、開始時にenv-varsを使用して入力を取得します。あなたは新しいCGI標準を書くことを提案していますか? –

+0

@AdrianColomitchi私はトーンを感謝しませんが、 http要求を処理できるバックエンドには何かがあります。私はOPにスクリプトの停止を処理する方法を知っているもう1つの要求をサポートすることを意味しました –

答えて

0

いくつかの予備テストの後、PHP shmopによって提供される共有メモリ機能は、私にとって利用可能な現在のサーバー環境で使用するのが最も簡単で安全なものになると思われます。正しい方向に私を指摘したAdrian Colomitchi(RAMディスク==共有メモリ)に感謝します!

0

CGIは柔軟性がありません。そのため、ソリューションは他の手段に依存する必要があります。

コピー戦略:

  1. RAMディスク上のファイルことを置く - ファイルIOは、TCPのものでFSシグナリングを交換する

  2. を下に行く必要があります。エグゼキュータスクリプトを専用ポートをリッスンする「アボートデーモン」へのソケットを開くようにします。エグゼキュータスクリプト "socket peeks"が "abort daemon"から1バイトでも利用可能な場合、それは中止されます。エグゼキュータスクリプトが開始されると、開かれたポートを「中断するページ」に伝えるだけで済みます。 "Abort"ボタンでURLを指す別のスクリプトは、 "killer byte"を送るための "abort daemon"と通信する必要があります。 PHPを実行しているサーバーに関する追加情報で


、あなたはメッセージングのためのメカニズムとしてPHPキャッシュを試すこと - APC storeとの関連を参照してください。

他のキャッシュが存在するようです - list of othersここにあります。


はおそらく行き過ぎ - redis - 彼らはデータベース、キャッシュおよびメッセージ・ブローカーとして使用し、メモリ内のデータ構造店、(BSDがライセンス)

のRedisはオープンソースであると言います。

supported languages、CとPHPの巨大なリストの中にあります。 wikipediaのエントリを持つのにはるかに顕著に見えます。

+0

クイック返信ありがとう、Adrian ...私はTCPを使用するのが好きですが、IT管理者がセキュリティ上の理由からポートを開くことに同意するかどうかはわかりません。私は、PHPからの環境変数を設定する行に沿って、別のAjaxリクエストで行うことができると思っていましたが、まだPHPから環境変数を設定することはあまりありませんでした。スクリプトの起動後に変更された変数が表示されるか、起動時に固定されるのでしょうか? –

+0

問題のサーバはLinux Debianで動作するApache 2です。 –

+0

@RobertHairgrove - まずRAMディスクを試してみてください。再TCPでは、クライアントはサーバーに直接接続することはありません(httpのやりとり以外)、ローカルホストだけがそのポートを開くと、sysadmはより柔軟になります。 –

関連する問題