什么是消息队列,以及哪些场景需要用到消息队列?
消息队列是为了帮助程序完成一些耗时较长的任务而定义的一个概念,比如调用第三方接口、音视频转码、Excel导出等等...
创建消费队列任务类
例如你想创建一个TestJob的任务
php artisan make:job TestJob
执行成功后,将会在App\Jobs目录生成TestJob.php文件
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class TestJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//
}
}
其中的handle方法就是要执行的具体任务了。此处先暂停说明句号,后面再慢慢讲。
监听队列任务
你可以通过在命令行运行以下命令监听(二选一即可):
php artisan queue:work
php artisan queue:listen
两者的区别:
work:会将程序代码读入到缓存中,修改代码中,队列还是会运行原来的代码,除非停止监听,重新运行:php artisan queue:work才会读入新的代码,适合生产环境。优点是性能好,减少文件IO。
listen:修改代码即时生效,适合开发环境,性能比不上work。
消息队列任务入队
你可以在任何地址将任务入队,不管是控制器、中间件、service层或者Artisan 命令行等等。
无参数方式:
TestJob::dispatch()
带参数方式(参数可以有多个):
TestJob::dispatch('admin',1);
编写具体任务实现
回到刚才的TestJob.php文件,如果我们要接收参数,只需要在__construct()方法中依次接收参数即可,在handle()方法中编写具体的任务实现。如下所示:
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class TestJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $username = '';
protected $user_id = 0;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($username,$user_id)
{
$this->username = $username;
$this->user_id = $user_id;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
echo '任务运行:' . date('Y-m-d H:i:s') . PHP_EOL;
echo $this->username. PHP_EOL;
}
}
其中:
5cec41fd-4753-489e-b039-50bde3570e4b:任务ID,由laravel框架生成。
Processing:表示任务正在执行。
Processed:表示队列执行完成。
Failed:表示队列任务失败。
后期将会介绍队列常见的错误以及解决方法。