【问题标题】:Adding a new job with GearmanManager?使用 GearmanManager 添加新工作?
【发布时间】:2017-05-06 03:24:50
【问题描述】:

我对整个 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-&gt;addServer('127.0.0.1')。根据文档,127.0.0.1 应该是默认设置,但运行 PHP 5.4.11 的情况似乎并非如此。如果我在$gm-&gt;addTask() 之后调用$gm-&gt;runTasks(),我现在可以让任务运行。我希望只需要调用$gm-&gt;addTask(),该任务就会被添加到数据库中,GearmanManager 会看到它并进行后台处理。还在挖……

最好的问候,
安德鲁

【问题讨论】:

    标签: php gearman


    【解决方案1】:

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

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

    安排未来的工作

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

    立即运行作业

    1. 使用when_to_runNULL 手动将作业插入gearmand_queue
    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

    【讨论】:

      【解决方案2】:

      在添加任务之前,需要启动 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 看起来像worker.php:

      <?php
      
      $worker= new GearmanWorker(); 
      
      $worker->addServer(); 
      
      while ($worker->work());
      
      function Metadata_Ingest_Report( $job )
      { 
          // do something
      }
      

      并启动这个工人

      /usr/bin/php worker.php
      

      【讨论】:

      • GearmanManager 作为一个守护进程负责管理workers,如果你不使用GearmanManager,上面是你会运行的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多