考虑这种代码将任务推送到队列以运行位于同一类中的自定义处理程序方法:
<?php namespace Space;
class Spaceship {
public static function cruise()
{
// Throtting in 3 seconds...
Queue::later(3, '\Space\Spaceship@throttle', $coordinates, 'queue-name');
}
public static function throttle($job, $data)
{
$job->delete();
return 'ok';
}
}
在我添加$ job-&gt; delete()之前,此工作正常;但现在它给出了一个错误:
exception 'Symfony\Component\Debug\Exception\FatalErrorException' with message 'Call to a member function delete() on a non-object
在Laravel 4.2 docs中,没有解释为什么推送队列任务指向自定义处理程序方法,您不需要使用$ job-&gt; delete()从队列中显式删除任务?然而,这种实现工作,并且当记录$ job参数时,它是错误的。
答案 0 :(得分:1)
转到app\config\queue.php
并检查default
键。如果后者设置为sync
,则会出现上述行为。
sync
驱动程序会立即运行您的任务,这意味着,Queue::later
实际上是Queue::push
。
尝试将Queue::later
转换为Queue::push
,代码将无误运行。
至于队列中任务的显式删除,大部分都是不必要的。但是,您必须考虑不提供自动删除作业的队列服务。
就我而言,AWS SQS(消息队列服务)会在从队列管中拉出作业后自动删除该作业。