質問を見てくれてありがとう。
背景
私は、非常に短い時間枠で複数(最大300)のPHPコンソールスクリプトを継続的に生成するいくつかのマシンを持っています。これらのスクリプトはすばやく(1秒未満)実行されてから終了します。これらのスクリプトはすべて、大きなトライ構造への読み取り専用アクセスが必要です。これは、各スクリプトが実行されるたびにメモリにロードするのに非常にコストがかかります。サーバーはLinuxを実行します。
私のソリューション
トライ構造をメモリに保持し、PHPクライアントからの要求を受信するCデーモンを作成します。すべてのPHPクライアントからリクエストを受け取り、メモリ構造のルックアップを実行して回答を返し、PHPスクリプトがその作業を行わないようにします。要求と応答はどちらも短い文字列(20文字以内)です
私の問題
は、Cデーモンとプロセス間通信に非常に慣れていないことです。多くの調査の結果、選択肢をメッセージキューとUnixドメインソケットに絞り込みました。メッセージキューは、デーモンがそれらにシリアルに応答するためのすべての要求をキューに入れると私が思うので(私は間違っているかもしれません)、適切であるように思われます。ただし、Unixドメインソケットの方が使いやすいようです。しかし、私は答えを見つけることができなかったさまざまな質問があります:
- PHPスクリプトはどのようにしてメッセージを送受信したり、UNIXソケットを使用してデーモンと通信したりできますか?逆に、CデーモンはどのPHPプロセスに応答を送信する必要があるかをどのように追跡しますか?
- 私が見たデーモンのほとんどの例では、内部にスリープ状態がある無限のwhileループを使用しています。私のデーモンは、いつでも接続できる多くの接続を処理する必要があり、応答の待ち時間が重要です。PHPスクリプトがスリープ中にリクエストを送信した場合、デーモンはどのように反応しますか?投票とepollについて読みましたが、これは受信したメッセージを待つ正しい方法ですか?
- 各PHPプロセスは、常に1つの要求を送信し、応答の受信を待機します。デーモンがダウンしている/使用できない場合、PHPプロセスは設定された最大時間応答を待機し、応答が受信されない場合はハングするのではなく続行することを確認する必要があります。これはできますか?
データ構造の実際のルックアップは非常に高速です。FIFO方式で要求を処理するだけで十分だと思うので、複雑なマルチスレッドや同様のソリューションは必要ありません。また、これはミッションクリティカルなサービスであり、このタイプのプログラムにはかなり慣れていないため、単純に愚かにする必要があります。(私は知っていますが、私はこれを回避する方法が本当にありません、そして学習経験は素晴らしいでしょう)
私が持っている特定の質問に光を当てるコードスニペットを本当にいただければ幸いです。低レベルのIPCのこの暗い世界への私の理解をさらに深めるガイドとポインタへのリンクも歓迎します。
ご協力いただきありがとうございます!
アップデート
この質問をしたときよりもはるかに多くのことを知っているので、ThriftフレームワークとZeroMQの両方がハードなソケットレベルのプログラミングを抽象化する素晴らしい仕事をしていることに興味のある人に指摘したいと思います。Thriftは、サーバーの足場を無料で提供します。
実際、ネットワークサーバーを構築するという大変な作業をすべて行うのではなく、問題をすでに解決している優れた非同期サーバーを使用してアプリケーションサーバーコードを作成することを検討してください。もちろん、非同期IOを使用するサーバーは、集中的なCPU処理(またはイベントループブロック)を必要としないネットワークアプリケーションに最適です。
Pythonの例:Twisted、gevent。私はgeventを好みますが、tornadoはHTTPサーバー側に焦点を合わせているため、含めません。
Rubyの例:EventMachine
もちろん、Node.jsは基本的に、今日の非同期サーバーのデフォルトの選択肢です。
さらに詳しく知りたい場合は、C10k問題とUnixネットワークプログラミングをお読みください。