考慮所有的選項有進程或線程相互(鎖,互斥,信號量,消息隊列,共享內存等)互動,我有點失去了什麼是最好的做我想做的。廣播式IPC
我想要幾個進程等待某個事件發生。也就是說,我希望他們能夠阻止或者直到
- 達到一定的超時或
- 某個事件被其他進程觸發。
在任何時候,可以有任意數量的這樣的等待進程,當喚醒事件發生時,它們都必須喚醒,而不是一個。
而一個限制,可能使這個更難的是:它必須是PHP的,也必須從mod_php的Apache中運行工作。
考慮所有的選項有進程或線程相互(鎖,互斥,信號量,消息隊列,共享內存等)互動,我有點失去了什麼是最好的做我想做的。廣播式IPC
我想要幾個進程等待某個事件發生。也就是說,我希望他們能夠阻止或者直到
在任何時候,可以有任意數量的這樣的等待進程,當喚醒事件發生時,它們都必須喚醒,而不是一個。
而一個限制,可能使這個更難的是:它必須是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)
)讀取。它會阻止您設置的超時或直到「主控」重新寫回。通過那個電話後,關閉插座,繼續做你想做的事...
這聽起來令人難以置信的有趣...讓我檢查一下。 – jjj 2010-08-19 13:42:58
我再次強調,如果我是你,我會嘗試重新建模應用程序,如果可能的話首先不需要任何IPC。這可能適用於你所問的問題(並沒有使用其他形式的IPC的無限制阻塞問題,例如信號量),但是在實現像這樣的IPC系統之前,我會嘗試找到一個正常的解決方案。 .. – ircmaxell 2010-08-19 13:46:43
是的,抱歉沒有提供更多細節。這將是一個Web應用程序,一個長AJAX查詢將首先掛起並等待,然後在確切的時刻返回。並且該返回必須與查看該網頁的所有用戶同步。可能還會添加應用程序的控制檯版本。 – jjj 2010-08-19 14:10:05