应用场景:会员注册成功后,会给用户发送邮件及短信通知,按文档介绍,app/Jobs下应该会有Email.php和Sms.php两个类文件,分别实现邮件和短信通知。
而其实,这两个通知已经有现成的方法实现了,现在要做得是,队列里去分别调用即可。
数据库:
要使用 database 这个队列驱动的话,则需要创建一个数据表来记住任务,你可以用 queue:table 这个 Artisan 命令来创建这个数据表的迁移。当迁移建好后,就可以用 migrate 这个命令来创建数据表。
php artisan queue:table
php artisan migrate
实现方法:创建一个回调任务类Callback.php,该类代码如下:
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldQueue;
/**
* Class Callback
* @package App\Jobs
*/
class Callback implements SelfHandling, ShouldQueue
{
use InteractsWithQueue, SerializesModels;
/**
* @var string 回调方法
*/
private $callback;
/**
* @var array 回调参数
*/
private $paramArr = [];
/**
* Create a new command instance.
*
* @param string $callback 回调方法
* @param array $paramArr 回调参数
*/
public function __construct($callback, array $paramArr = [])
{
$this->callback = $callback;
$this->paramArr = $paramArr;
}
/**
* Execute the command.
*
* @return void
*/
public function handle()
{
// 执行回调方法
$result = call_user_func_array($this->callback, $this->paramArr);
}
}
使用方法:
public function postRegistrar($request) {
// 注册代码
// 发送邮件
$emailJobId = Queue::push(new Callback(Email::class.'::send', [$email]));
// 发送短信
$smsJobId = Queue::push(new Callback(Sms::class.'::send', [$mobile]));
}
延迟队列怎么写?
$emailJobId = Queue::later(60, new Callback(Email::class.'::send', [$email]));
最后启动队列侦听器:
php artisan queue:listen
是不是用起来方便多了?