3

考虑到让进程或线程相互交互的所有选项(锁、互斥体、信号量、消息队列、共享内存等),我有点不知道什么是我想做的最好的事情。

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

  1. 达到某个超时,或
  2. 某个事件由另一个进程触发。

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

可能使这变得更加困难的一个限制是:它必须是 PHP,并且它还必须在 apache 中运行的 mod_php 中工作。

4

1 回答 1

2

好吧,这有点“hacky”,但你可以用套接字来做到这一点。这真的取决于你想要做什么......我真的想知道你是否真的需要这种系统(而不是试图将流程简化到他们根本不需要 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
    )
);

Then, simply read from the socket (socket_read($sock)). It'll block for up to the timeout you set or until the "master" writes back to it. After passing that call, just close the socket and continue on doing what you want to do...

于 2010-08-19T13:37:13.760 回答