在整个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-> addTask()之后调用$gm-> runTasks(),则可以运行任务.我希望只需要调用$gm-> addTask()即可将任务添加到数据库中,GearmanManager会看到它并对其进行后台处理.还在挖…
最好的祝福,
安德鲁
解决方法:
因此,似乎在pecl-gearman上未公开when_to_run功能.因此,我们无法使用其内置方法来计划将来的作业.似乎该库并未像应有的那样创建数据库记录(我认为这实际上可能是Gearmand在运行作业之前未将其卸载到数据库中.
为了解决这个问题,我们决定执行以下操作.
安排未来的工作
>手动将作业插入gearman_queue.
>每分钟运行CRON来对队列表执行ping操作,并加载具有when_to_run< = time()的作业
>通过addTask($function,$payload)和runTasks()触发这些作业. $payload也包含来自数据库的UUID.
> GearmanManager拿起工作,并将有效载荷交给各自的工人.
> Worker运行,然后在完成后,使用DELETE从数据库中删除该项目.
立即运行作业
>将when_to_run为NULL的作业手动插入到gearmand_queue中.
>运行addTask($function,$payload)和runTasks(). $payload也包含来自数据库的UUID.
> GearmanManager拿起工作,并将有效负载交给其重复的工作人员.
> Worker运行,然后在完成后,使用DELETE从数据库中删除该项目.
结论
Gearmand作业服务器,GearmanManager和pecl-gearman在支持的内容和完成方式方面似乎都不同步.在大多数情况下,我认为这个问题属于pecl-gearman与Gearmand交谈的核心.
我还已在pecl-gearman项目上为when_to_run:https://bugs.php.net/bug.php?id=64120打开了功能请求