2010-08-19 77 views
2

考慮所有的選項有進程或線程相互(鎖,互斥,信號量,消息隊列,共享內存等)互動,我有點失去了什麼是最好的做我想做的。廣播式IPC

我想要幾個進程等待某個事件發生。也就是說,我希望他們能夠阻止或者直到

  1. 達到一定的超時或
  2. 某個事件被其他進程觸發。

在任何時候,可以有任意數量的這樣的等待進程,當喚醒事件發生時,它們都必須喚醒,而不是一個。

而一個限制,可能使這個更難的是:它必須是PHP的,也必須從mod_php的Apache中運行工作。

回答

1

嗯,這有點「哈克」,但你可以用套接字來做到這一點。這真的取決於你想做什麼?我真的不知道,如果你確實需要這樣的系統(而不是試圖簡化流程,在那裏他們不需要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