我还是整个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会看到它并将其调整起来。还在挖......
最好的问候,
安德鲁
答案 0 :(得分:4)
因此when_to_run
似乎没有公开pecl-gearman
功能。因此,我们无法使用其内置方法为将来安排作业。它似乎也不像它应该创建数据库记录(我假设这可能实际上是Gearmand在运行之前没有将作业卸载到数据库。
为了解决这个问题,我们决定采取以下措施。
安排未来工作
gearman_queue
。when_to_run <= time()
addTask($function, $payload)
和runTasks()
解雇这些工作。 $payload
也包含来自数据库的UUID。DELETE
从数据库中删除该项目。立即开始工作
gearmand_queue
when_to_run
手动将作业插入NULL
。addTask($function, $payload)
和runTasks()
。 $payload
也包含来自数据库的UUID。DELETE
从数据库中删除该项目。<强>结论强>
Gearmand Job Server,GearmanManager和pecl-gearman在支持什么以及如何完成时似乎都不同步。在大多数情况下,我认为这个问题属于与Gearmand交谈的pecl-gearman的核心。
我还在when_to_run
:https://bugs.php.net/bug.php?id=64120
答案 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