使用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);