Laravel--Jobs(同步异步)消息队列Queue--晋升篇

更新时间:2023-06-30 09:53:47 阅读: 评论:0

Laravel--Jobs(同步异步)消息队列Queue--晋升篇
Laravel --Jobs (同步\异步)消息队列 Queue --晋升篇
在很多项⽬业务复杂到⼀定程度、项⽬⼤到⼀定程度,就都是⼀些重构、优化、升级等⼿段,让项⽬更稳健;能抵挡更强的“风暴”。⽽异步服务器则也是减轻服务器压⼒,提⾼项⽬性能的⼀个常见⼿段之⼀,把⼀些实时性不强,⽽且量还⽐较⼤的业务可
以异步来解决。临近年底了,丢丢哥最近⼯作⽐较忙,博客更新少了点。见谅
本篇博客主要介绍异步消息队列简要的介绍下同步消息队列
本篇博客为了更明确异步消息队列和同步消息队列的实现原理以MySQL消息队列为⽰例,但是在真正的项⽬中(如果没有单独的异步服务器,则建议使⽤Redis消息队列)
⼀、简介
Laravel的队列服务为不同的队列后端系统提供了⼀套统⼀的API。队列允许你将⼀个耗时的任务进⾏延迟处理,例如像e-mail发送。这能让应⽤程序对页⾯的请求有更快的响应。
⼆、配置
队列的配置⽂件被保存在config/queue.php中。但是Laravel中优先选⽤.env的配置在这个⽂件内你可以找到包含在Laravel中的每⼀种队列驱动连接设置。它们包含了数据库、Beanstalkd、IronMQ、Amazon SQS、Redis 以及提供本机使⽤的 synchronous 驱动。
.env配置同步:
.env配置异步:
另外框架也提供了 null 这个队列驱动⽤来丢弃队列任务。
1.⽣成队列数据库表与失败队列数据库表
本实例中是⽤群发email的实例,如果模仿,请配置⾃⼰的邮件服务
php artisan queue:table
php artisan queue:failed-table
php artisan migrate
2.创建Mysql数据(需要发邮件)
3.⽣成队列任务
php artisan make:job SendUrEmail --queued
然后在项⽬的App\Jobs⾥⾯会⽣成⼀个SendUrEmail.php⽂件
接下来我们再⽣成⼀个控制器UrController
php artisan make:controller UrController --resource
定义路由routes.php
Route::resource('/ur','UrController');
速度与激情7歌曲编写控制器UrController
<?php
namespace App\Http\Controllers;
u Illuminate\Http\Request;
u App\Http\Requests;
u App\Jobs\CreateMessage;
u App\Jobs\SendUrEmail;
class UrController extends Controller
{
...
...
/**
* 这个⽅法我们⽤来模拟发送消息队列.
*
* @param  int  $id
* @return \Illuminate\Http\Respon
*/
public function show($id)
{
//
$datas = \DB::table('ur')->where('status',1)->get();
foreach($datas as $data){
$job = (new SendUrEmail($data->name,$data->email));
$this->dispatch($job);
}
return redirect('/ur');
}
编辑队列⽂件SendUrEmail.php
<?php北京新世界
namespace App\Jobs;
u App\Jobs\Job;
u Illuminate\Queue\SerializesModels;
u Illuminate\Queue\InteractsWithQueue;
u Illuminate\Contracts\Bus\SelfHandling;
u Illuminate\Contracts\Queue\ShouldQueue;
u Illuminate\Support\Facades\Mail;
class SendUrEmail extends Job implements SelfHandling, ShouldQueue
{
u InteractsWithQueue, SerializesModels;
protected $name;
protected $email;
/**
* Create a new job instance.备忘录格式
*
* @return void
*/
public function __construct($name, $email)不可以的英文
{
//
$this->name = $name;
$this->email = $email;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
// 如果参试⼤于三次
if ($this->attempts() > 3) {
\Log::info($this->name.'邮件参试失败过多');
}el{
九年级英语单词表
// 每次进来休息3秒钟
sleep(3);
// 休息10秒钟
//$this->relea(10);
oops
$url = 'www.ydma';
shy guy$title = '测试邮件';
$to = $this->email;
// 邮件发送
$flag = Mail::nd('st', ['name' => $this->name, 'url' => $url], function ($message) u ($to, $title) {                // 发送
$message->to($to)->subject('【亲爱的程序猿】' . $title);
});
echo date('Y-m-d H:i:s')."\n".$to.'的邮件已发送...';
if($flag){
\Log::info($this->name.'邮件发送成功');
}el{
\Log::info($this->name.'邮件发送失败');
}
}
}
/**
* 处理⼀个失败的任务
*
* @return void
*/
public function failed()
{
托福红宝书\Log::error($this->name.'队列任务执⾏失败'."\n".date('Y-m-d H:i:s'));
}
}
三、执⾏程序
1.我们env是设置的databa(异步消息队列)
2.开启队列监听
php artisan queue:listen
3.或者开启后台监听(不影响⾃⼰输⼊其他命令)
php artisan queue:listen &
4.也能⽤work 后⾯参数是休息时间和尝试次数
half是什么意思
php artisan queue:work connection --daemon --sleep=3 --tries=3
5.访问⽹址(这个⽹址是我⾃⼰本地的)
6.然后看我的Mysql的变化jobs表本来有8条队列数据需要处理
7.然后看终端监听的变化
8.消息队列被⼀条条的推送..反观数据库jobs的变化,发现被清空了,说明队列执⾏完了
⽽且页⾯并不是等待邮件发完才跳转,⽽是发送这个队列命令后直接重定向到了ur列表页⾯(跳转很快),这就是异步队列的整个⼯作流程
当然如果你看了我之前的⼀⽚⽂章也可以做做全局SQL监听,你就会在⽇志中发现,每执⾏⼀个队列 job表⾥⾯就要执⾏4次命令增、删、改、查,如果是10000条数据的队列就是40000次的表操作,所以说databa的消息队列⽤也得当⼼,虽然是异步的,考虑的因素还是⽐较多的。
同步消息队列
这个消息队列,说实话丢丢哥我也是⽤得少,为什么呢?暂时并没有发现它的应⽤场景的优势。
与异步不同的是设置同步消息队列将.env或config/queue.php⾥⾯的配置改成是sync
然后执⾏页⾯的时候发现页⾯等待跳转的时间很长,得所有的邮件发送完成后才会跳转页⾯(如果队列中有任务执⾏失败反复的参试那这页⾯应该肯定timeout了)
bec中级报名时间扩展思路
1.队列有可能失败,失败的队列会写⼊到mysql的failed_jobs表⾥⾯:
2.那么如何让这些失败的队列让电脑后⾯⾃动去执⾏消息推送呢?也就是执⾏这些命令,怎么让程序⾃动完成
3.如果是在⼀个服务器中⽤消息队列,是不是⼀直要开常驻进程??那是不是有消耗?当异步到达⼀个程度的时候,是不是可以开服务器集群⾥⾯的异步服务器专门来做这个事??
希望我的博客对你们有所帮助,你的认可就是我最⼤的动⼒。。
  /
本⽂为作者原创,允许转载,转载后请以说明⽂章出处. 如转载但不标明来源,后果⾃负。

本文发布于:2023-06-30 09:53:47,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/162465.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:队列   消息   失败   邮件   转载   发送   监听   服务器
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图