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 相关文章推荐
php下删除字符串中HTML标签的函数
Aug 27 PHP
php 信息采集程序代码
Mar 17 PHP
php 获取百度的热词数据的代码
Feb 18 PHP
解析php DOMElement 操作xml 文档的实现代码
May 10 PHP
php实现zip压缩文件解压缩代码分享(简单易懂)
May 10 PHP
在PHP中使用X-SendFile头让文件下载更快
Jun 01 PHP
PHP与MYSQL中UTF8 中文排序示例代码
Oct 23 PHP
PHP实现获取域名的方法小结
Nov 05 PHP
HTML中嵌入PHP的简单方法
Feb 16 PHP
PHP实现基于mysqli的Model基类完整实例
Apr 08 PHP
ThinkPHP表单令牌错误的相关解决方法分析
May 20 PHP
PHP面向对象程序设计(OOP)之方法重写(override)操作示例
Dec 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实现的支持imagemagick及gd库两种处理的缩略图生成类
2014/09/23 PHP
PHP下用Swoole实现Actor并发模型的方法
2019/06/12 PHP
Laravel5.1框架注册中间件的三种场景详解
2019/07/09 PHP
JavaScript实现简单的时钟实例代码
2013/11/23 Javascript
基于javascript实现简单计算器功能
2016/01/03 Javascript
js中遍历Map对象的简单实例
2016/08/08 Javascript
用户管理的设计_jquery的ajax实现二级联动效果
2017/07/13 jQuery
解决Webpack 热部署检测不到文件变化的问题
2018/02/22 Javascript
vue-cli项目中使用公用的提示弹层tips或加载loading组件实例详解
2018/05/28 Javascript
Vue组件全局注册实现警告框的实例详解
2018/06/11 Javascript
JavaScript 斐波那契数列 倒序输出 输出100以内的质数代码实例
2019/09/11 Javascript
react实现移动端下拉菜单的示例代码
2020/01/16 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
2020/09/10 Javascript
使用JavaScript实现贪吃蛇游戏
2020/09/29 Javascript
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
栈和队列数据结构的基本概念及其相关的Python实现
2015/08/24 Python
Python中扩展包的安装方法详解
2017/06/14 Python
Python实现连接postgresql数据库的方法分析
2017/12/27 Python
python3实现多线程聊天室
2018/12/12 Python
python抓取搜狗微信公众号文章
2019/04/01 Python
python上传时包含boundary时的解决方法
2020/04/08 Python
详解python with 上下文管理器
2020/09/02 Python
python如何利用paramiko执行服务器命令
2020/11/07 Python
Laura Geller官网:美国彩妆品牌
2018/12/29 全球购物
欧洲最古老的鞋厂:Peter Kaiser
2019/11/05 全球购物
如何向接受结构参数的函数传入常数值
2016/02/17 面试题
寄语十八大感言
2014/02/07 职场文书
材料工程专业毕业生求职信
2014/03/04 职场文书
信息学院毕业生自荐信范文
2014/03/04 职场文书
公证委托书标准格式
2014/09/11 职场文书
中小学校园安全广播稿
2014/09/29 职场文书
运动会通讯稿200字
2015/07/20 职场文书
高中数学课堂教学反思
2016/02/18 职场文书
职场领导同事生日简短祝福语
2019/08/06 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书
Nginx工作原理和优化总结。
2021/04/02 Servers