广播式IPC

问题描述:

考虑所有的选项有进程或线程相互(锁,互斥,信号量,消息队列,共享内存等)互动,我有点失去了什么是最好的做我想做的。广播式IPC

我想要几个进程等待某个事件发生。也就是说,我希望他们能够阻止或者直到

  1. 达到一定的超时或
  2. 某个事件被其他进程触发。

在任何时候,可以有任意数量的这样的等待进程,当唤醒事件发生时,它们都必须唤醒,而不是一个。

而一个限制,可能使这个更难的是:它必须是PHP的,也必须从mod_php的Apache中运行工作。

嗯,这有点“哈克”,但你可以用套接字来做到这一点。这真的取决于你想做什么?我真的不知道,如果你确实需要这样的系统(而不是试图简化流程,在那里他们不需要IPC在所有)的...

创建一个“侦听器”deamon,它只会接受套接字连接并将其放入队列中。它会运行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))读取。它会阻止您设置的超时或直到“主控”重新写回。通过那个电话后,关闭插座,继续做你想做的事...

+0

这听起来令人难以置信的有趣...让我检查一下。 – jjj 2010-08-19 13:42:58

+0

我再次强调,如果我是你,我会尝试重新建模应用程序,如果可能的话首先不需要任何IPC。这可能适用于你所问的问题(并没有使用其他形式的IPC的无限制阻塞问题,例如信号量),但是在实现像这样的IPC系统之前,我会尝试找到一个正常的解决方案。 .. – ircmaxell 2010-08-19 13:46:43

+0

是的,抱歉没有提供更多细节。这将是一个Web应用程序,一个长AJAX查询将首先挂起并等待,然后在确切的时刻返回。并且该返回必须与查看该网页的所有用户同步。可能还会添加应用程序的控制台版本。 – jjj 2010-08-19 14:10:05