使用PHP和Gearman检测没有可用的服务器

问题描述:

我目前正在使用PHP的标准绑定使用Gearman(docs here)。所有功能正常,但我有一个小的问题,无法检测何时调用GearmanClient :: addServer(docs here)是“成功”,我的意思是...使用PHP和Gearman检测没有可用的服务器

问题是,添加服务器尝试没有套接字I/O,这意味着服务器可能实际上不存在或不可操作。这意味着随后的代码调用(在服务器没有实际存在的情况下)失败并导致PHP警告

有什么方法或者什么是最好的方式来确认Gearman守护程序在服务器添加之前还是之后?

我想做到这一点,这样我可以可靠地处理其中的Gearman可能已经死亡的场景,或服务器未接触也许..

非常感谢。

我们首先尝试通过在主机和端口上手动调用fsockopen传递给addServer,但事实证明,由于Gearman服务器期望在该套接字上发生某些事情,因此可能会留下很多挂起的连接。

我们使用监视器脚本来检查守护进程及其工作人员的状态 - 类似于this perl script on Google Groups。我们修改脚本以重启守护程序,如果它没有运行。

如果这不具有吸引力,请查看Gearman Protocol(特别是上述线程中引用的“管理协议”部分)并使用status命令。这将为您提供有关作业和工作人员状态的信息,但也意味着您可以执行与守护程序的套接字连接,而不会挂起它。

您可以使用此库: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);