我目前正在使用标准绑定的PHP使用Gearman(文档在这里)。所有功能都很好,但我有一个小问题,无法检测何时调用GearmanClient::addServer(这里的文档)是"成功的",我的意思是…
问题是添加服务器不尝试套接字I/O,这意味着服务器可能实际上不存在或不运行。这意味着后续代码调用(在服务器实际上不存在的情况下)失败并导致PHP警告
在添加Gearman守护进程之前或之后,是否有任何方法或最好的方法来确认它在服务器上是可操作的?我希望实现这一点,这样我就可以可靠地处理Gearman可能已经死亡,或者服务器可能无法联系的情况。
许多谢谢。我们首先尝试在传递给addServer
的主机和端口上手动调用fsockopen
,但事实证明,这可能会留下大量挂起的连接,因为Gearman服务器期望在该套接字上发生某些事情。
我们使用一个监视脚本来检查守护进程及其工作程序的状态——类似于Google Groups上的这个perl脚本。我们修改了脚本,以便在守护进程未运行时重新启动它。
如果这没有吸引力,请查看Gearman协议(特别是"管理协议"部分,在上面的线程中引用)并使用status
命令。这将为您提供有关作业和工人状态的信息,但也意味着您可以执行到守护进程的套接字连接,而不会使其挂起。
您可以使用这个库:https://github.com/necromant2005/gearman-stats它没有外部依赖。
$adapter = new TweeGearmanStatQueueGearman(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);