使用GearmanManager添加新作业?

时间:2013-01-30 22:48:33

标签: php gearman

我还是整个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会看到它并将其调整起来。还在挖......

最好的问候,
安德鲁

2 个答案:

答案 0 :(得分:4)

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

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

安排未来工作

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

    1. 使用gearmand_queue when_to_run手动将作业插入NULL
    2. 运行addTask($function, $payload)runTasks()$payload也包含来自数据库的UUID。
    3. GearmanManager接收工作并将有效载荷交给他们的救援人员。
    4. 工作人员运行,然后在完成时,使用DELETE从数据库中删除该项目。
    5. <强>结论

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

      我还在when_to_runhttps://bugs.php.net/bug.php?id=64120

      的pecl-gearman项目上打开了一项功能请求

答案 1 :(得分:0)

在添加任务之前,nedded起始装备服务器。

for 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