laravel: 用redis实现消息队列(Laravel 8.83.27)
一,配置
1,修改.env,确认保存了redis的连接信息
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
2,修改.env,指定默认的队列连接使用redis
QUEUE_CONNECTION=redis
3, 确保config/database.php中指定了redis的连接
二,创建消息的消费者
1,通过命令行创建:
[lhdop@blog dignews]$ php artisan make:job consumemail
Job created successfully.
2, 编写代码:
<?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;
use Illuminate\Support\Facades\Log;
class consumemail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $msg;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($msg)
{
//
$this->msg = $msg;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
echo "接收到消息:".$this->msg.";开始处理:\n";
//log
Log::info("queue msg:".$this->msg);
}
}
三,创建消息的生产者
1,创建controller
php artisan make:controller UserController
2, 代码:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Jobs\consumemail;
class UserController extends Controller
{
//
//直接返回字符串
public function home(){
$rand_digit = rand(100,999);
$msg = 'hello,随机数:'.$rand_digit;
$this->dispatch(new consumemail($msg));
return 'Hello, World!'.$msg;
}
}
四,测试效果
1, 在终端运行接收队列消息的任务程序:
[lhdop@blog dignews]$ php artisan queue:work --daemon --quiet --delay=3 --sleep=3 --tries=1
2, 访问controller的页面地址后,观察终端的反应:
接收到消息:hello,随机数:525;开始处理:
接收到消息:hello,随机数:647;开始处理:
接收到消息:hello,随机数:347;开始处理:
接收到消息:hello,随机数:818;开始处理:
接收到消息:hello,随机数:112;开始处理:
接收到消息:hello,随机数:547;开始处理:
接收到消息:hello,随机数:938;开始处理:
接收到消息:hello,随机数:615;开始处理:
接收到消息:hello,随机数:715;开始处理:
五,查看laravel的版本:
[lhdop@blog dignews]$ php artisan --version
Laravel Framework 8.83.27