注释:在$queue->pop($queueName);是vendorshmilyzxtqueuequeuesDatabaseQueue.php方法内使用事务执行SQL,并且创建vendorshmilyzxtqueuejobsDatabaseJob.php的实例
//取出一个任务
public function pop($queue = null)
{
$queue = $this->getQueue($queue);
if (!is_null($this->expire)) {
//$this->releaseJobsThatHaveBeenReservedTooLong($queue);
}
$tran = $this->connector->beginTransaction();
//判断是否有一个可用的任务需要执行
if ($job = $this->getNextAvailableJob($queue)) {
$this->markJobAsReserved($job->id);
$tran->commit();
$config = array_merge($this->jobEvent, [
'class' => 'shmilyzxtqueuejobsDatabaseJob',
'queue' => $queue,
'job' => $job,
'queueInstance' => $this,
]);
return Yii::createObject($config);
}
$tran->commit();
return false;
}
至于:$job->execute();是DatabaseJob继承父类Job执行的,顺着代码找下去是yiibaseComponent trigger执行的事件,
/**
* 执行任务
*/
public function execute()
{
$this->trigger(self::EVENT_BEFORE_EXECUTE, new JobEvent(["job" => $this, 'payload' => $this->getPayload()]));//beforeExecute 执行任务之前的一个事件 在JobEvent中并没有什么可执行的代码
$this->resolveAndFire();//真正执行的任务的方法
}
/**
* 真正任务执行方法(调用hander的handle方法)
* @param array $payload
* @return void
*/
protected function resolveAndFire()
{
$payload = $this->getPayload();
$payload = unserialize($payload); //反序列化数据
$type = $payload['type'];
$class = $payload['job'];
if ($type == 'closure' && ($closure = (new Serializer())->unserialize($class[1])) instanceof Closure) {
$this->handler = $this->getHander($class[0]);
$this->handler->closure = $closure;
$this->handler->handle($this, $payload['data']);
} else if ($type == 'classMethod') {
$payload['job'][0]->$payload['job'][1]($this, $payload['data']);
} else if ($type == 'staticMethod') {
$payload['job'][0]::$payload['job'][1]($this, $payload['data']);
} else {//执行的`SendMail`类的`handle($job,$data)`方法
$this->handler = $this->getHander($class);
$this->handler->handle($this, $payload['data']);
}
//执行完任务后删除
if (!$this->isDeletedOrReleased()) {
$this->delete();
}
}
最后到了执行的SendMail类的handle($job,$data),在这里就是推送到队列的对象和数据,接着就是我们的处理逻辑了.
public function handle($job,$data)
{
if($job->getAttempts() > 3){
$this->failed($job);
}
$payload = $job->getPayload();
echo '<pre>';print_r($payload);
//$payload即任务的数据,你拿到任务数据后就可以执行发邮件了
//TODO 发邮件
}
总结
以上所述是小编给大家介绍的Yii2 队列 shmilyzxt/yii2-queue简介,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对易采站长站网站的支持!







