Php 豆茎+;Pheanstalk延迟现有工作

Php 豆茎+;Pheanstalk延迟现有工作,php,yii,beanstalkd,pheanstalk,Php,Yii,Beanstalkd,Pheanstalk,我是豆茎+凤凰话的中级。我正在使用Beanstalk开发我的核心部分(后台流程)。毫无疑问,这是一个很好的工具,但我有一种情况。我正在使用beanstalk和Yii框架 比方说,我有两份工作A(管A工作)和B(管B工作),两份工作都在不同的管和工人之下。B依赖于A。B可能会在A之前先由工作进程获取,然后在A上启动进程。在这种情况下,我需要B延迟几秒钟(120秒),直到A执行 据我所知,没有任何直接的方法使工作延误。为此,您需要删除作业B并以延迟时间放回同一队列。如果我错了,请纠正我 现在的情况是

我是豆茎+凤凰话的中级。我正在使用Beanstalk开发我的核心部分(后台流程)。毫无疑问,这是一个很好的工具,但我有一种情况。我正在使用beanstalk和Yii框架

比方说,我有两份工作A(管A工作)和B(管B工作),两份工作都在不同的管和工人之下。B依赖于A。B可能会在A之前先由工作进程获取,然后在A上启动进程。在这种情况下,我需要B延迟几秒钟(120秒),直到A执行

据我所知,没有任何直接的方法使工作延误。为此,您需要删除作业B并以延迟时间放回同一队列。如果我错了,请纠正我

现在的情况是,在这种情况下,我无法得到实际的管道名称,因为pheanstalk只提供作业Id和作业数据。我将我的代码粘贴到下面

$pheanstalkA = Yii::app()->beanstalk->getClient($client);
$pheanstalkA->watch('A-tube');

$pheanstalkB = Yii::app()->beanstalk->getClient($client);
$pheanstalkB->watch('B-tube');
现在,如果我得到任何使用保留函数的工作

$jobB = $pheanstalkB->reserve();
它将为您提供如下输出,我们可以看到beanstalk没有提供获取此作业的管道名称

Pheanstalk_Job Object
(
    [_id:Pheanstalk_Job:private] => 2
    [_data:Pheanstalk_Job:private] => Job Data ....
)
正如我们所知,单个工人可以在N管中观看,所以如果我想推迟这项工作,并想将其置于同一管下。我们怎样才能找到job的管道名称


谢谢…

Beanstalkd不会返回作业本身来自的管道,但您可以使用命令“stats job”查询它

put 1 0 100 5
hello
INSERTED 10

reserve
RESERVED 10 5
hello

stats-job 10
OK 143
---
id: 10
tube: default
state: reserved
pri: 1
age: 33
delay: 0
ttr: 100
time-left: 82
reserves: 1
timeouts: 0
releases: 0
buries: 0
kicks: 0
我放入一个简单的作业,保留它(并获取作业ID:10),然后运行“stats job”,获取ID、原始管道和其他信息

Pheanstalk具有
statsJob
功能,您可以将其传入作业(从
reserve
返回)


如果某个特定的作业还有什么您无法获得的信息,您可以随时将元信息放入作业本身。

找到了一种新方法,可以在一定的延迟时间内将作业放回同一队列。我们可以使用pheanstalk库的directrelease功能。e、 g

    $this->pheanstalk->release($job,$priority,$delay);
这样,我们就不需要找到作业的实际管道,并且可以避免并发问题,特别是在我的例子中


谢谢你的帮助

谢谢你,阿利斯特。。帮了大忙!!