gpt4 book ai didi

php - 使用 GearmanManager 添加新工作?

转载 作者:可可西里 更新时间:2023-11-01 01:04:21 29 4
gpt4 key购买 nike

我对整个 Gearman 和 GearmanManager 周期还是陌生的。我有一台正常工作的服务器,并且已经验证我的作业在服务器启动时是否已经在我的队列(MySQL 表)中。但是,我需要能够从 PHP 向队列中添加一个新作业,如果可能的话,还需要从 worker 内部添加一个新作业。

现在我有一份工作,我将在部署我们的新代码库时创建它。这将是第一个运行的作业,其目的是为报告收集一些数据并存储它。

这需要每小时运行一次,所以我想利用 when_to_run 列。我一直在仔细研究 Gearman 的文档,但我仍然对我实际上应该如何将作业添加到队列感到困惑。

我试过运行:

<?php
$gm = new GearmanClient;
$gm->addServer();
$gm->doBackground('Metadata_Ingest_Report', '', com_create_guid());

附带说明,是的,我确实安装了 php-pecl-uuid。

上面的代码只是挂起,什么也没做。没有作业被添加到数据库中,什么也没有发生。

这是因为我不完全了解作业是如何发送的,我正在尽最大努力实现 RTM,但我没有任何运气。

因此,如果您有什么可以指点我的,或者如果有人有时间解释我应该如何设置作业并将作业添加到 MySQL 队列,以便 GearmanManager 的工作人员挑选它们,那就太棒了。

编辑:看来您必须调用$gm->addServer('127.0.0.1')。根据文档,127.0.0.1 应该是默认设置,但运行 PHP 5.4.11 时似乎并非如此。如果在 $gm->addTask() 之后调用 $gm->runTasks(),我现在可以让任务运行。我希望只需要调用 $gm->addTask() 任务就会被添加到数据库中,GearmanManager 会看到它并将其假脱机。还在挖掘...

最好的问候,
安德鲁

最佳答案

看来 when_to_run pecl-gearman 上未公开功能.因此,我们无法使用他们的内置方法为 future 安排工作。该库似乎也没有像它应该的那样创建数据库记录(我假设这实际上可能是 Gearmand 在作业运行之前没有将作业卸载到数据库。

为了解决这个问题,我们决定采取以下措施。

安排 future 的工作

  1. 手动将作业插入 gearman_queue .
  2. 每分钟运行一次 CRON 以 ping 队列表并加载具有 when_to_run <= time() 的作业
  3. 通过 addTask($function, $payload) 解雇这些工作和 runTasks() . $payload还包含来自数据库的 UUID。
  4. GearmanManager 接管工作并将负载交给各自的工作人员。
  5. Worker 运行,然后在完成时使用 DELETE 从数据库中删除项目.

立即运行作业

  1. 手动将作业插入 gearmand_queuewhen_to_runNULL .
  2. 运行 addTask($function, $payload)runTasks() . $payload还包含来自数据库的 UUID。
  3. GearmanManager 接管工作并将有效负载交给相应的工作人员。
  4. Worker 运行,然后在完成时使用 DELETE 从数据库中删除项目.

结论

Gearmand Job Server、GearmanManager 和 pecl-gearman 在支持的内容和实现方式方面似乎都不同步。在大多数情况下,我认为这个问题是 pecl-gearman 与 Gearmand 谈话的核心内容。

我还为 when_to_run 打开了 pecl-gearman 项目的功能请求: https://bugs.php.net/bug.php?id=64120

关于php - 使用 GearmanManager 添加新工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14615366/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com