Laravel队列(queue)应用

DATE: 2016-12-17 / VIEWS: 1636

应用场景:会员注册成功后,会给用户发送邮件及短信通知,按文档介绍,app/Jobs下应该会有Email.php和Sms.php两个类文件,分别实现邮件和短信通知。
而其实,这两个通知已经有现成的方法实现了,现在要做得是,队列里去分别调用即可。

数据库:
要使用 database 这个队列驱动的话,则需要创建一个数据表来记住任务,你可以用 queue:table 这个 Artisan 命令来创建这个数据表的迁移。当迁移建好后,就可以用 migrate 这个命令来创建数据表。
php artisan queue:table
php artisan migrate
实现方法:创建一个回调任务类Callback.php,该类代码如下:
<?php namespace App\Jobs;

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
是不是用起来方便多了?