2009-08-27 23 views
2

Webアプリケーションのバックエンド(単純なLAMP設定)でレポートを生成する単純なC++アプリケーションがあります。問題は、バックエンドが約1.5GBのメモリを必要とするデータファイルをロードすることです。

プログラムAは常にサーバー上で実行され、常にデータがロードされているメインの実行可能ファイルであり、実際にレポートを実行できます。

プログラムBはphpから生成され、必要な情報を取得するためにプログラムAに簡単なリクエストを行い、データを返します。

私の質問は次のとおりです: BにAに何かをさせる良い仕組みは何ですか? Aが何もしていない場合、どのように動作しますか?私は本当にタスクや他の方法で私のタイヤを回転させてポーリングしたくない。C++でのプロセス間通信

+0

申し訳ありません...これはすべてLinuxで動作しています。 – captncraig

+1

LAMPについて言及して以来、私はlinuxタグを追加しました。 IPCはプラットフォームに依存するため、これが重要です。 –

答えて

4

名前付きのミューテックス/イベントを使用すると、基本的には1つのスレッド(あなたの場合はプロセスA)が待っているのを待つことができます。次にプロセスBが実行され、処理が必要なミューテックス/イベントを通知し、プロセスAを起動します。

は、Microsoftにある場合:Linux上

MutexEvent

IPCは、異なる動作しますが、同じ機能があります。

Linux Stuff

または代わりに、C++の部分ますマルチプラットフォームのブーストIPCライブラリの1つを使用できます。私はPHPが利用できるものがよく分からないが、疑いの余地のないものがあるだろう。

+1

+1ネットワークカードを叩く必要はありません。特に、同じボックスでWebサーバーを実行している場合は特にそうです。 – Alex

+0

+1は、ブーストプロセスに言及しています。 http://www.boost.org/doc/libs/1_39_0/doc/html/interprocess.html – Laserallan

+0

ありがとう!私はBoostメッセージキューのペアを使用するつもりだと思う。 – captncraig

2

localhostで動作するTCPソケットを使用します。

  1. C++アプリケーションをデーモンにします。
  2. PHPフロントエンドは、デーモンへの永続的な接続を作成します。 pfsockopen
  3. リクエストが行われると、PHPはデーモンにリクエストを送信し、デーモンはそのリクエストをすべて処理して返します。 PHP SocketsC++ Sockets

EDIT

は、参考のためにいくつかのリンクを追加しました。私はいくつかが本当に悪いかもしれないどこでもプロセス間通信のソケットを使用するCコード。

+0

これはやや面白いようです。しかし、私にとってはむしろ外国人に聞こえる。使用中の参考資料や例がありますか? – captncraig

2

IPCはC++上で簡単ですが、POSIX C APIを呼び出すだけです。

しかし、あなたが求めているのは、キューマネージャーの方がはるかに良いでしょう。バックグラウンドデーモンがキュー上のメッセージを待つようにし、フロントエンドPHPは処理したいタスクの仕様を追加するだけです。キュー・マネージャーによっては、タスクの結果を同じオブジェクトに追加することができます。また、完了メッセージの新しいキューを定義することもできます。

最もよく知られている高性能キュー・マネージャの1つがRabbitMQです。非常に使いやすいもう1つはMemcacheQです。

または、タスクのためにMySQLにテーブルを追加するだけで、バックグラウンドプロセスは未完了のものを定期的に照会します。これはうまく動作し、非常に信頼できる(ゲットーキューと呼ばれることもあります)が、高いタスク数/秒で故障します。

+0

ええ、それは本当に私が使用したいメッセージキューのように聞こえる。メッセージがなくてもバックグラウンド処理がブロックされるので、うまくいくでしょう。ありがとう! – captncraig

関連する問題