Php 如何在gearman中获取特定类型的排队作业数?

Php 如何在gearman中获取特定类型的排队作业数?,php,gearman,Php,Gearman,我有很多gearman客户发送了一份工作,比如job1 $client = new GearmanClient(); $client->addServer(); $client->doBackground('job1', 'workload'); 处理这项工作需要,比如说10秒钟。 我想跟踪在任何给定时间,有多少“job1”工作等待工人处理。我怎样才能做到这一点呢?看来没有任何直接的方法可以获得这些信息 这里有一些选择。首先,(搜索“谈到检查状态”),您可以将它们存储在某个中心位置

我有很多gearman客户发送了一份工作,比如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