Php 如何在gearman中获取特定类型的排队作业数?
我有很多gearman客户发送了一份工作,比如job1Php 如何在gearman中获取特定类型的排队作业数?,php,gearman,Php,Gearman,我有很多gearman客户发送了一份工作,比如job1 $client = new GearmanClient(); $client->addServer(); $client->doBackground('job1', 'workload'); 处理这项工作需要,比如说10秒钟。 我想跟踪在任何给定时间,有多少“job1”工作等待工人处理。我怎样才能做到这一点呢?看来没有任何直接的方法可以获得这些信息 这里有一些选择。首先,(搜索“谈到检查状态”),您可以将它们存储在某个中心位置
$client = new GearmanClient();
$client->addServer();
$client->doBackground('job1', 'workload');
处理这项工作需要,比如说10秒钟。
我想跟踪在任何给定时间,有多少“job1”工作等待工人处理。我怎样才能做到这一点呢?看来没有任何直接的方法可以获得这些信息 这里有一些选择。首先,(搜索“谈到检查状态”),您可以将它们存储在某个中心位置,并从任何客户处查询它们
其次,您可以设置要使用的Gearman服务器,然后自己对队列运行查询。这可能是两个选项中更简单更干净的一个。Gearmand有一个您可以查询的telnet接口。(协议的具体细节可在gearman网站上找到-) 我在这里使用了这段代码作为我自己滚动的起点。 (这段代码本身非常好,您应该能够直接使用它)
这是一个不太漂亮的解决方案,但除非有人改进gearman管理界面,以便您可以直接通过PHP进行对话或为其编写插件,否则您需要自己进行快速检查,我使用以下bash one行文:
(echo status ; sleep 0.1) | netcat 127.0.0.1 4730
这将打开到本地主机上运行的gearman实例的连接,并发送状态查询。它包含该实例上作业的名称和数量。然后可以使用grep
/awk
/wc
等处理信息,以进行报告和警报
我还对workers查询执行相同的操作,该查询显示所有连接的workers
(echo workers ; sleep 0.1) | netcat 127.0.0.1 4730
睡眠是为了让连接保持足够长的开放时间,以便回复
管理命令的完整列表以及输出的含义位于。只需搜索“管理协议”。要扩展d5ve的答案,请在netcat连接的“超时”中添加-w参数,否则您将无法返回命令提示符
$ (echo status ; sleep 0.1) | sudo netcat 127.0.0.1 4730 -w 1
我使用的是
gearman\u top
,它是
网站的输出示例:
+-----------------------+--------+-------+-------+---------+
| Name | Worker | Avail | Queue | Running |
+-----------------------+--------+-------+-------+---------+
| check_results | 1 | 1 | 0 | 0 |
| host | 3 | 3 | 0 | 0 |
| service | 3 | 3 | 0 | 0 |
| eventhandler | 3 | 3 | 0 | 0 |
| servicegroup_jmx4perl | 3 | 3 | 0 | 0 |
| hostgroup_japan | 3 | 3 | 0 | 0 |
+-----------------------+--------+-------+-------+---------+
在Ubuntu18.04上,我默认安装了gearman包中的
gearadmin
二进制文件
gearadmin--help
gearadmin--status
可代替netcat替代方案使用:
gearadmin --status
queue1 334 10 10
和一行:while:;不做gearadmin——状态;睡眠1;完成
只是好奇:为什么需要睡眠0.1?例如memcached的等效命令不需要睡眠。我不得不使用nc而不是netcat,但在其他方面效果很好+1用于使用持久队列:这还可以更好地控制队列。我不能建议更改一个字符,但使用#作为提示字符会使解析器将代码行解释为注释,并使其变暗。感谢列解释对列加倍感谢!它似乎没有说任何地方
gearadmin --status
queue1 334 10 10