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初学者头疼问题总结
Jul 08 PHP
php &amp;&amp; 逻辑与运算符使用说明
Mar 04 PHP
PHP利用str_replace防注入的方法
Nov 10 PHP
php中curl、fsocket、file_get_content三个函数的使用比较
May 09 PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
Jan 07 PHP
php与Mysql的一些简单的操作
Feb 26 PHP
修改PHP脚本使WordPress拦截垃圾评论的方法示例
Dec 10 PHP
php 的反射详解及示例代码
Aug 25 PHP
PHP面向对象程序设计类的定义与用法简单示例
Dec 27 PHP
PHP实现Session入库/存入redis的方法
May 04 PHP
Laravel 框架返回状态拦截代码
Oct 18 PHP
基于PHP实现用户登录注册功能的详细教程
Aug 04 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配置文件中最常用四个ini函数
2007/03/19 PHP
php使用imagick模块实现图片缩放、裁剪、压缩示例
2014/04/17 PHP
浅谈PHP中Stream(流)
2015/06/08 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
2019/06/14 PHP
避免回车键导致的页面无意义刷新的解决方法
2011/04/12 Javascript
window.parent与window.openner区别介绍
2012/04/12 Javascript
jquery动态加载select下拉框示例代码
2013/12/10 Javascript
js(JavaScript)实现TAB标签切换效果的简单实例
2014/02/26 Javascript
js限制文本框只能输入整数或者带小数点的数字
2015/04/27 Javascript
JS和css实现检测移动设备方向的变化并判断横竖屏幕
2015/05/25 Javascript
javascript实现3D切换焦点图
2015/10/16 Javascript
jquery实现网页的页面平滑滚动效果代码
2015/11/02 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
2016/05/09 Javascript
jQuery实现给input绑定回车事件的方法
2017/02/09 Javascript
NodeJS基础API搭建服务器详细过程记录
2017/04/01 NodeJs
Vue实现virtual-dom的原理简析
2017/07/10 Javascript
网页中的图片查看器viewjs使用方法
2017/07/11 Javascript
Easyui使用Dialog行内按钮布局的实例
2017/07/27 Javascript
react学习笔记之state以及setState的使用
2017/12/07 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
vue学习笔记五:在vue项目里面使用引入公共方法详解
2019/04/04 Javascript
微信小程序图片自适应实现解析
2020/01/21 Javascript
Node.js API详解之 assert模块用法实例分析
2020/05/26 Javascript
把项目从Python2.x移植到Python3.x的经验总结
2015/04/20 Python
Python实现短网址ShortUrl的Hash运算实例讲解
2015/08/10 Python
python 实现在Excel末尾增加新行
2018/05/02 Python
Python实现绘制双柱状图并显示数值功能示例
2018/06/23 Python
python修改txt文件中的某一项方法
2018/12/29 Python
使用Python构造hive insert语句说明
2020/06/06 Python
Python函数__new__及__init__作用及区别解析
2020/08/31 Python
简单几步用纯CSS3实现3D翻转效果
2019/01/17 HTML / CSS
简历中个人自我评价分享
2014/03/15 职场文书
2015年班级工作总结范文
2015/04/03 职场文书
CSS预处理框架——Stylus
2021/04/21 HTML / CSS
详解MySQL的半同步
2021/04/22 MySQL
Java时间工具类Date的常用处理方法
2022/05/25 Java/Android