2011-10-31 34 views
2

我目前正在使用PHP的標準綁定使用Gearman(docs here)。所有功能正常,但我有一個小的問題,無法檢測何時調用GearmanClient :: addServer(docs here)是「成功」,我的意思是...使用PHP和Gearman檢測沒有可用的服務器

問題是,添加服務器嘗試沒有套接字I/O,這意味着服務器可能實際上不存在或不可操作。這意味着隨後的代碼調用(在服務器沒有實際存在的情況下)失敗並導致PHP警告

有什麼方法或者什麼是最好的方式來確認Gearman守護程序在服務器添加之前還是之後?

我想做到這一點,這樣我可以可靠地處理其中的Gearman可能已經死亡的場景,或服務器未接觸也許..

非常感謝。

回答

0

我們首先嚐試通過在主機和端口上手動調用fsockopen傳遞給addServer,但事實證明,由於Gearman服務器期望在該套接字上發生某些事情,因此可能會留下很多掛起的連接。

我們使用監視器腳本來檢查守護進程及其工作人員的狀態 - 類似於this perl script on Google Groups。我們修改腳本以重啓守護程序,如果它沒有運行。

如果這不具有吸引力,請查看Gearman Protocol(特別是上述線程中引用的「管理協議」部分)並使用status命令。這將爲您提供有關作業和工作人員狀態的信息,但也意味着您可以執行與守護程序的套接字連接,而不會掛起它。

0

您可以使用此庫:https://github.com/necromant2005/gearman-stats 它沒有外部依賴關係。

$adapter = new \TweeGearmanStat\Queue\Gearman(array(
    'h1' => array('host' => '10.0.0.1', 'port' => 4730, 'timeout' => 1), 
    'h2' => array('host' => '10.0.0.2', 'port' => 4730, 'timeout' => 1), 
)); 
$status = $adapter->status(); 
var_dump($status); 
相關問題