3

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

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

这需要每小时运行一次,所以我想利用该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->runTasks()在之后调用,我现在可以让任务运行$gm->addTask()。我希望只需要调用$gm->addTask(),任务就会被添加到数据库中,GearmanManager 会看到它并将其后台处理。还在挖...

最好的问候,
安德鲁

4

2 回答 2

4

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

为了解决这个问题,我们决定执行以下操作。

安排未来的工作

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

立即运行作业

  1. 手动将作业插入gearmand_queuewhen_to_run.NULL
  2. 运行addTask($function, $payload)runTasks()。也包含来自数据库的$payloadUUID。
  3. GearmanManager 接手工作并将有效负载交给他们的相应工作人员。
  4. Worker 运行,然后在完成时使用DELETE.

结论

Gearmand Job Server、GearmanManager 和 pecl-gearman 在支持什么以及如何完成时似乎都不同步。在大多数情况下,我认为这个问题是 pecl-gearman 与 Gearmand 交谈的核心。

我还在 pecl-gearman 项目上打开了一个功能请求when_to_runhttps ://bugs.php.net/bug.php?id=64120

于 2013-02-04T19:20:31.270 回答
0

在添加任务之前,需要启动 gearman 服务器。

对于 Linux:

/usr/bin/gearmand -d  -L 127.0.0.1 -q libdrizzle /
--libdrizzle-user=your_db_user --libdrizzle-password=your_db_pass /
--libdrizzle-db=your_db_name --libdrizzle-mysql -vvvv

添加任务后,创建工人看起来像worker.php:

<?php

$worker= new GearmanWorker(); 

$worker->addServer(); 

while ($worker->work());

function Metadata_Ingest_Report( $job )
{ 
    // do something
}

并启动这个工人

/usr/bin/php worker.php
于 2013-02-04T14:10:42.370 回答