Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从Gearman处获取计划作业列表?_Php_Gearman - Fatal编程技术网

Php 如何从Gearman处获取计划作业列表?

Php 如何从Gearman处获取计划作业列表?,php,gearman,Php,Gearman,我目前正在评估Gearman在我们的后端外包一些昂贵的数据导入工作。到目前为止,这看起来很有希望。然而,有一点我似乎找不到任何信息如何从Gearman处获取计划作业列表? 我意识到我可以使用管理协议来获取每个函数当前排队作业的数量,但是我需要关于实际作业的信息。还可以选择使用持久队列(例如MySQL)并查询数据库中的作业,但我觉得绕过Gearman获取此类信息是非常错误的。除此之外,我没有主意了 也许我根本不需要这个:)所以这里有更多关于我想做什么的背景资料,我愿意接受更好的建议。客户端和工作程

我目前正在评估Gearman在我们的后端外包一些昂贵的数据导入工作。到目前为止,这看起来很有希望。然而,有一点我似乎找不到任何信息如何从Gearman处获取计划作业列表?

我意识到我可以使用管理协议来获取每个函数当前排队作业的数量,但是我需要关于实际作业的信息。还可以选择使用持久队列(例如MySQL)并查询数据库中的作业,但我觉得绕过Gearman获取此类信息是非常错误的。除此之外,我没有主意了

也许我根本不需要这个:)所以这里有更多关于我想做什么的背景资料,我愿意接受更好的建议。客户端和工作程序都在PHP中运行。在我们的管理界面中,管理员可以为客户端触发新的导入;由于导入需要一段时间,因此它将作为后台任务启动。现在我想回答的简单问题是:上次为这个客户机运行导入是什么时候?导入是否已为此客户端排队(在这种情况下,触发新导入应该无效)?很好:这个作业在队列中的哪个位置(这样我就可以估计它何时运行)


谢谢

管理协议是您通常使用的,但正如您所发现的,它不会列出队列中的实际任务。我们已经解决了这个问题,方法是跟踪我们在应用程序层启动的当前任务,并在worker中有一个回调,告诉应用程序任务何时完成。这允许我们在任务完成时执行清理、通知等,并允许我们将此逻辑保留在应用程序中,而不是工作程序本身

与进度相关的最佳方法是只使用Gearman本身的内置进度机制,在PHP模块中,您可以使用
$job->sendStatus(percentDone,100)
调用它。然后,客户机可以使用任务句柄(启动作业时将返回)从服务器检索该值。这将允许您在界面中向用户显示当前进度

只要您的应用程序中有当前正在运行的任务,您就可以用它来回答是否已经有类似的任务在运行,但您也可以使用gearman的内置作业合并/重复数据消除功能;添加任务时,请参见$unique参数


当前队列中的位置将无法通过Gearman获得,因此您也必须在应用程序中执行此操作。我不会向Gearman持久层询问这些信息。

您已经给了自己一个答案:使用DBRMS(MySQL或Postgres)作为持久性后端,并查询Gearman_队列表

例如,我们开发了一个混合解决方案:我们为作业生成并传递一个唯一的id,在对作业排队时,将其作为第三个参数传递给doBackground()

然后,我们使用此id查询gearman表,查看“unique_key”表字段以验证作业状态。您还可以获取队列位置,因为记录已经排序


专业奖金:我们还捕获员工内部的异常。如果作业失败,我们将作业有效负载(JSON序列化对象)写入一个文件,然后拾取该文件,并通过cronjob增加“重试”内部计数器重新获取作业,因此我们最多重试单个作业3次,如果作业仍然失败,我们可以稍后检查作业。

非常感谢,我想将作业句柄与客户机关联将是一种可行的方法。仍然感觉有点笨拙,例如,当应用程序停止运行但Gearman继续工作时,将出现死机的工作句柄。好吧,没有什么好的看门人流程不能处理的,听起来像是一个我可以接受的解决方案。