PHP加MySQL消息队列深入理解


Posted in PHP onFebruary 27, 2021

消息队列:在消息的传输过程中保存消息的容器。
消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。

PHP加MySQL消息队列深入理解

如图所示
在不使用消息队列的情况下,用户的请求数据直接写入数据库,再高并发的情况下,会对数据库造成巨的压力,同时也使得响应延迟加剧。在使用消息队列后,用户请求的数据发送给消息队列后立即返回,再由消息队列的消费者进程(通常情况下,该进程独立部署在专门的服务器集群上)从消息队列中获取数据,异步写入数据库。由于消息队列服务器处理速度远大于数据库,因此用户的响应延迟可得到有效改善。

尤其是在淘宝搞“双十一”,“春节特卖”等活动时,使用消息队列有很好的削峰作用--------
即通过异步处理,将短时间高并发产生的事务消息存储在消息队列中,从而削平高峰期的并发事务。所以在一些电子商务网站促销活动中,合理使用消息队列,可有效抵御促销活动刚开始大量涌入的订单对系统造成的冲击。

PHP加MySQL消息队列深入理解

需要注意的是,由于数据写入消息队列后立即返回给用户数据在后续的业务校验、写数据库等操作可能失败,因此在使用消息队列进行业务异步处理后,需要适当修改业务流程进行配合,如订单提交后,订单数据写入消息队列,不能立即返回用户订单提交成功,需要在消息队列的订单消费者进程真正处理完该订单,甚至商品出库后,再通过电子邮件或SMS消息通知用户订单成功,以免交易纠纷。

最近遇到一个批量发送短信的需求,短信接口是第三方提供的。刚开始想到,获取到手机号之后,循环调用接口发送不就可以了吗?

但很快发现问题:当短信数量很大时,不仅耗时,而且成功率很低。

于是想到,用PHP和MySQL实现一个消息队列,一条一条的发送短信。下面介绍具体的实现方法:

首先,建立一个数据表sms,包含以下字段:

id,
phone, //手机号
content //短信内容

将需要发送的短信和手机号存入sms表中。

接下来,需要用PHP实现一个定时器,定时读取一条记录,并发送短信:

<?php
$db = new Db();
$sms = new Sms();
while(true){
  $item = $db->getFirstRecord(); //获取数据表第一条记录
  if(!$item){
    //如果队列中没有数据,则结束定时器
    break;
  }
  $res = $sms->send($item['phone'],$item['content']); //发送短信
  if($res){
    $db->deleteFristRecord(); //删除发送成功的记录
    echo $item['phone'].'发送成功';
  }else{
    echo $item['phone'].'发送失败,稍后继续尝试';
  }
  sleep(10); //每隔十秒循环一次      
}
 
echo '发送完毕!';
?>

将代码保存为timer_sms.php,打开命令行,执行定时器:

php timer_sms.php

到此这篇关于PHP+MySQL消息队列深入理解的文章就介绍到这了,更多相关PHP+MySQL消息队列内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
PHP4引用文件语句的对比
Oct 09 PHP
模仿OSO的论坛(三)
Oct 09 PHP
php session 错误
May 21 PHP
一道关于php变量引用的面试题
Aug 08 PHP
解析用PHP实现var_export的详细介绍
Jun 20 PHP
PHP删除HTMl标签的实现代码
Jun 30 PHP
mac环境中使用brew安装php5.5.15
Aug 18 PHP
PHP中应该避免使用同名变量(拆分临时变量)
Apr 03 PHP
PHP自定义函数格式化json数据示例
Sep 14 PHP
thinkPHP订单数字提醒功能的实现方法
Dec 01 PHP
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法
Sep 16 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
Oct 21 PHP
php慢查询日志和错误日志使用详解
Feb 27 #PHP
php的单例模式及应用场景详解
Feb 27 #PHP
PHP+Mysql分布式事务与解决方案深入理解
Feb 27 #PHP
PHP并发场景的三种解决方案代码实例
Feb 27 #PHP
常见的5个PHP编码小陋习以及优化实例讲解
Feb 27 #PHP
laravel数据库查询结果自动转数组修改实例
Feb 27 #PHP
PHP的垃圾回收机制代码实例讲解
Feb 27 #PHP
You might like
php下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
php定时计划任务与fsockopen持续进程实例
2014/05/23 PHP
Linux下手动编译安装PHP扩展的例子分享
2014/07/15 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
PHP的mysqli_select_db()函数讲解
2019/01/23 PHP
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
JS控制文本框textarea输入字数限制的方法
2013/06/17 Javascript
JQuery对class属性的操作实现按钮开关效果
2013/10/11 Javascript
node.js+Ajax实现获取HTTP服务器返回数据
2014/11/26 Javascript
jQuery创建自定义的选择器用以选择高度大于100的超链接实例
2015/03/18 Javascript
JavaScript数据绑定实现一个简单的 MVVM 库
2016/04/08 Javascript
js自定义QQ菜单效果
2017/01/10 Javascript
windows下vue-cli及webpack搭建安装环境
2017/04/25 Javascript
slideToggle+slideup实现手机端折叠菜单效果
2017/05/25 Javascript
本地搭建微信小程序服务器的实现方法
2017/10/27 Javascript
微信小程序使用for循环动态渲染页面操作示例
2018/12/25 Javascript
vue2.0项目集成Cesium的实现方法
2019/07/30 Javascript
详解使用JWT实现单点登录(完全跨域方案)
2019/08/02 Javascript
vue2.* element tabs tab-pane 动态加载组件操作
2020/07/19 Javascript
[02:01]BBC DOTA2国际邀请赛每日综述:八强胜者组鏖战,中国队喜忧参半
2014/07/19 DOTA
基于Python实现的扫雷游戏实例代码
2014/08/01 Python
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
Python企业编码生成系统之主程序模块设计详解
2019/07/26 Python
Django实现文件上传下载功能
2019/10/06 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
2019/11/08 Python
基于python实现生成指定大小txt文档
2020/07/20 Python
Python文件操作及内置函数flush原理解析
2020/10/13 Python
Pytorch如何切换 cpu和gpu的使用详解
2021/03/01 Python
CSS3 透明色 RGBA使用介绍
2013/08/06 HTML / CSS
css3给背景图片加颜色遮罩的方法
2019/11/05 HTML / CSS
CSS3颜色值RGBA与渐变色使用介绍
2020/03/06 HTML / CSS
自我评价怎么写好呢?
2013/12/05 职场文书
大学生党员自我评价范文
2014/04/09 职场文书
2016元旦文艺汇演主持词
2015/07/06 职场文书
vue3中provide && inject的使用
2021/07/01 Vue.js