3

プロセスまたはスレッドが相互に対話するためのすべてのオプション (ロック、ミューテックス、セマフォ、メッセージ キュー、共有メモリなど) を考えると、自分がやりたいことを行うのに何が最善かについて少し迷っています。

特定のイベントが発生するのを待機する複数のプロセスが必要です。つまり、どちらかをブロックするまで

  1. 特定のタイムアウトに達する、または
  2. 特定のイベントが別のプロセスによってトリガーされます。

いつでも、そのような待機中のプロセスが任意の数存在する可能性があり、ウェイクアップ イベントが発生すると、1 つだけでなくすべてのプロセスがウェイクアップする必要があります。

おそらくこれをさらに難しくしている 1 つの制限は、PHP である必要があり、Apache で実行されている mod_php からも動作する必要があることです。

4

1 に答える 1

2

まあ、それは少し「ハッキー」ですが、ソケットでこれを行うことができます。それは本当にあなたがやろうとしていることに依存します...私はあなたが実際にこの種のシステムを必要とするかどうか本当に疑問に思います(IPCをまったく必要としないところまでプロセスを単純化しようとするのではなく)...

ソケット接続を受け入れるだけの「リスナー」デーモンを作成し、それらをキューに入れます。socket_select新しい接続またはデータがソケットに書き込まれるのを待って実行されます。データが書き込まれた場合は、そのデータをすべてのアクティブな接続に書き込んでから、それらを閉じて最初からやり直します。新しい接続を受信すると、それをキューに入れてから、選択に戻ります...

したがって、「子」では、マスターに接続し、ブロッキングを設定してからsocket_set_block($sock)、タイムアウトを設定するだけです。

socket_set_option(
    $sock,
    SOL_SOCKET,  // socket level
    SO_SNDTIMEO, // timeout option
    array(
        "sec"=>10, // Timeout in seconds
        "usec"=>0  // I assume timeout in microseconds
    )
);

次に、ソケット(socket_read($sock))から読み取るだけです。設定したタイムアウトまで、または「マスター」が書き戻すまでブロックされます。その呼び出しを通過した後、ソケットを閉じて、やりたいことを続けてください...

于 2010-08-19T13:37:13.760 に答える