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 相关文章推荐
for循环连续求和、九九乘法表代码
Feb 20 PHP
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
May 29 PHP
深入PHP与浏览器缓存的分析
Jun 03 PHP
php计算两个整数的最大公约数常用算法小结
Mar 05 PHP
php压缩和解压缩字符串的方法
Mar 14 PHP
php经典算法集锦
Nov 14 PHP
PHP的Yii框架中过滤器相关的使用总结
Mar 29 PHP
php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例
May 28 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
Feb 07 PHP
laravel自定义分页效果
Jul 23 PHP
解决windows上php xdebug 无法调试的问题
Feb 19 PHP
PHP加MySQL消息队列深入理解
Feb 27 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制作静态网站的模板框架(三)
2006/10/09 PHP
PHP小程序自动提交到自助友情连接
2009/11/24 PHP
php cli 方式 在crotab中运行解决
2010/02/08 PHP
如何使用php判断所处服务器操作系统的类型
2013/06/20 PHP
使用PHP生成二维码的两种方法(带logo图像)
2014/03/14 PHP
优化 JavaScript 代码的方法小结
2009/07/16 Javascript
Javascript的匿名函数小结
2009/12/31 Javascript
JS DOM 操作实现代码
2010/08/01 Javascript
js从10种颜色中随机取色实现每次取出不同的颜色
2013/10/23 Javascript
jQuery遍历json的方法(推荐)
2016/06/12 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
2016/07/11 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
2016/09/05 Javascript
bootstrapValidator表单验证插件学习
2016/12/30 Javascript
微信小程序 详解页面跳转与返回并回传数据
2017/02/13 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
2017/03/11 Javascript
vue指令之表单控件绑定v-model v-model与v-bind结合使用
2019/04/17 Javascript
ES6中的迭代器、Generator函数及Generator函数的异步操作方法
2019/05/12 Javascript
JS实现网站吸顶条
2020/01/08 Javascript
Vue实现可移动水平时间轴
2020/06/29 Javascript
[47:22]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python 字符串定义
2009/09/25 Python
python Django框架实现自定义表单提交
2016/03/25 Python
用Python shell简化开发
2018/08/08 Python
pytorch 固定部分参数训练的方法
2019/08/17 Python
django中间键重定向实例方法
2019/11/10 Python
NumPy排序的实现
2020/01/21 Python
使用celery和Django处理异步任务的流程分析
2020/02/19 Python
使用python接受tgam的脑波数据实例
2020/04/09 Python
Python selenium文件上传下载功能代码实例
2020/04/13 Python
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2014/01/19 面试题
Ajax请求总共有多少种Callback
2016/07/17 面试题
自动化专业个人求职信范文
2013/12/30 职场文书
2015年小学师德师风建设工作总结
2015/10/23 职场文书
先进基层党组织事迹材料2016
2016/02/29 职场文书
使用Python的开发框架Brownie部署以太坊智能合约
2021/05/28 Python