一個工人考慮一個PHP的Web應用程序,其目的是接受用戶請求啓動通用異步作業,然後創建工作進程/線程來運行作業。作業不是CPU或內存密集型的,但預計會經常阻止I/O調用。每秒不應該有一兩個工作要開始,但由於運行時間較長,可能會有很多工作同時運行。與PHP的異步處理 - 每個作業
因此,這是最重要的是作業並行運行。此外,每個作業必須由負責殺雄工人,對用戶請求中止工人管理器守護進程進行監測等
什麼是去實現一個系統,如最好的方法?我可以看到:
- 從經理分叉工人 - 這似乎是最低級別的選項,我必須自己實施監控系統。 Apache是Web服務器,所以看起來這個選項需要任何PHP工作者通過FastCGI啓動。
- 使用某種類型的工作/消息隊列。 (gearman,beanstalkd,RabbitMQ等) - 起初,這似乎是一個明顯的選擇。經過一番研究,我對所有選項都有些困惑。例如,Gearman看起來就是專爲大型分佈式系統設計的,其中有一個固定的工作人員池......所以我不知道我需要的是否合適(每個工作一個工人)。
謝謝。我現在已經做了幾次,而且它真的很好。那麼,如果您的使用案例與系統的侷限性一致(IPC相當昂貴,等等),我應該說它工作得很好。如果它們沒有很好地對齊,那麼應該使用真正的線程實現和除PHP以外的語言...... – ircmaxell 2010-08-18 14:49:36
但是,請仔細閱讀'pcntl_fork()'。我在父進程和子進程之間以奇怪的方式共享數據庫連接時遇到了問題。如果某些PECL擴展共享類似的怪癖,我不會感到驚訝。我會迴避在PHP中分叉,並通過'exec()'等產生單獨的進程,只是爲了保持簡單 – 2010-08-18 14:52:03
好吧,我明確地重新打開孩子分支後的所有連接,因爲這個原因。分叉是沒有什麼可怕的(我經常使用它)。但是由於沒有關於這個主題的大量文檔,這是一個很多的試驗和錯誤。通過'exec'執行的問題是,它使通信和監控變得更加困難(因爲一個'exec'被阻塞,而另外兩個很難獲得非阻塞'exec'調用的進程ID(一個調用在末尾加上'&...))... – ircmaxell 2010-08-18 14:57:38