Laravel 队列为不同的后台队列服务提供了统一的 API,例如 Beanstalk,Amazon SQS,Redis,甚至其他基于关系型数据库的队列。队列的目的是将耗时的任务延时处理,比如发送邮件,从而大幅度缩短 Web 请求和响应的时间。
队列配置文件存放在 config/queue.php。每一种队列驱动的配置都可以在该文件中找到,包括数据库、Beanstalkd、Amazon SQS、Redis以及同步(本地使用)驱动。此处我门使用最常用的redis和rabbitMQ驱动。
由于是本地测试,所以我使用phpstudy配置好的nginx+php7.3+redis,rabbitMQ是基于erlang开发,所以需要安装erlang环境。使用composer安装了laravel5.7版本。erlang版本为Erlang v21.2 ,由于没有科学上网法,光网下载实在是慢,我在此处下载了资源https://www.jb51.net/softs/653513.html
此处需要注意的是安装rabbitMQ的版本需要对应erlang的版本,https://www.rabbitmq.com/which-erlang.html
php_amqp.dll扩展文件放入对应php版本的ext文件夹中,并且将rabbitmq.4.dll 文件复制到
php目录下K:\phpstudy_pro\Extensions\php\php7.3.4nts。在php.ini中添加 扩展项 extension=php_amqp.dll
laravle使用rabbitMQ需要先安装rabbitMQ驱动
composer require vladimir-yuldashev/laravel-queue-rabbitmq
此处可能会报错
是因为laravel版本和驱动不匹配引起的,此处composer安装的是最新版
composer require vladimir-yuldashev/laravel-queue-rabbitmq:7.1
安装成功后修改相关配置文件
1.在config/app.php文件中,providers数组中添加
VladimirYuldashev\LaravelQueueRabbitMQ\LaravelQueueRabbitMQServiceProvider::class,
2.在app/config/queue.php文件中,connections数组中添加rabbitmq的驱动配置
'rabbitmq' => [
'driver' => 'rabbitmq',
'host' => env('RABBITMQ_HOST', '127.0.0.1'),
'port' => env('RABBITMQ_PORT', 5672),//5672默认端口
'vhost' => env('RABBITMQ_VHOST', '/'),
'login' => env('RABBITMQ_LOGIN', 'guest'),
'password' => env('RABBITMQ_PASSWORD', 'guest'),
'queue' => env('RABBITMQ_QUEUE'), // name of the default queue,
'exchange_declare' => env('RABBITMQ_EXCHANGE_DECLARE', true), // create the exchange if not exists
'queue_declare_bind' => env('RABBITMQ_QUEUE_DECLARE_BIND', true), // create the queue if not exists and bind to the exchange
'queue_params' => [
'passive' => env('RABBITMQ_QUEUE_PASSIVE', false),
'durable' => env('RABBITMQ_QUEUE_DURABLE', true),
'exclusive' => env('RABBITMQ_QUEUE_EXCLUSIVE', false),
'auto_delete' => env('RABBITMQ_QUEUE_AUTODELETE', false),
],
'exchange_params' => [
'name' => env('RABBITMQ_EXCHANGE_NAME', null),
'type' => env('RABBITMQ_EXCHANGE_TYPE', 'direct'), // more info at http://www.rabbitmq.com/tutorials/amqp-concepts.html
'passive' => env('RABBITMQ_EXCHANGE_PASSIVE', false),
'durable' => env('RABBITMQ_EXCHANGE_DURABLE', true), // the exchange will survive server restarts
'auto_delete' => env('RABBITMQ_EXCHANGE_AUTODELETE', false),
],
],
然后新增.env的配置项
# mq相关配置
RABBITMQ_HOST=127.0.0.1 #mq的服务器地址
RABBITMQ_PORT=5672 #mq的端口
RABBITMQ_VHOST=/
RABBITMQ_LOGIN=guest #mq的登录名
RABBITMQ_PASSWORD=guest #mq的密码
RABBITMQ_QUEUE=queue_name #mq的队列名称
修改.env配置项
# redis切换成了rabbitMQ
QUEUE_CONNECTION=rabbitmq
# QUEUE_CONNECTION=redis
1.创建任务类
php artisan make:job Notice
创建的任务类内容如下
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class Notice implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
protected $data;
public function __construct($data)
{
//
$this->data=$data;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//根据传参来生成txt文章类容
$content="内容是".$this->data.",时间是".date('Y-m-d H:i:s',time());
file_put_contents('./queueTest.txt',$content,FILE_APPEND);
}
}
找一个方法来测试
public function index(){
$posts=Post::where('published_at', '<=', Carbon::now())//小于等于当前时间
->orderBy('published_at', 'desc')
->paginate(config('blog.posts_per_page'));
$oneposts=Post::query()->first();
//延迟60秒
//$job=(new Notice($oneposts))->delay(60);
$job=(new Notice($oneposts));
$this->dispatch($job);
return view('blog.index',compact('posts'));
}
使用命令行来监听队列
php artisan queue:listen
然后请求这index方法会发现
查看命令行当前目录下,多出来一个queueTest.txt文件,并且内容就是$oneposts。表示成功。