PHP+MySQL实现消息队列的方法分析


Posted in PHP onMay 09, 2018

本文实例讲述了PHP+MySQL实现消息队列的方法。分享给大家供大家参考,具体如下:

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

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

于是想到,用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定时器将会根据设定的时间间隔(这里设的是10秒),自动完成发送短信的任务。任务完成后将自动退出定时器,不再占用服务器资源。

根据我的测试,PHP定时器占用资源并不多,不会对服务器造成压力。而且是异步访问数据库,也不会影响数据库的运行。

这种方式的优点是:

1、后台运行,前台无需等待

2、成功率高,失败的记录会自动重发,直到成功

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
Cakephp 执行主要流程
Mar 24 PHP
php下利用curl判断远程文件是否存在的实现代码
Oct 08 PHP
第三章 php操作符与控制结构代码
Dec 30 PHP
php打造属于自己的MVC框架
Mar 07 PHP
php中使用cookie来保存用户登录信息的实现代码
Mar 08 PHP
PHP中如何使用session实现保存用户登录信息
Oct 20 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
Jan 05 PHP
在php中设置session用memcache来存储的方法总结
Jan 14 PHP
PHP编写登录验证码功能 附调用方法
May 19 PHP
php array_merge_recursive 数组合并
Oct 26 PHP
PHP实现下载远程图片保存到本地的方法
Jun 19 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
Jun 13 PHP
PHP共享内存使用与信号控制实例分析
May 09 #PHP
php curl批处理实现可控并发异步操作示例
May 09 #PHP
php使用curl伪造来源ip和refer的方法示例
May 08 #PHP
PHP+ajax实现获取新闻数据简单示例
May 08 #PHP
PHP 计算两个特别大的整数实例代码
May 07 #PHP
详解PHP发送邮件知识点
May 06 #PHP
PHP学习笔记之session
May 06 #PHP
You might like
destoon实现公司新闻详细页添加评论功能的方法
2014/07/15 PHP
php实现对两个数组进行减法操作的方法
2015/04/17 PHP
php显示时间常用方法小结
2015/06/05 PHP
thinkPHP多表查询及分页功能实现方法示例
2017/07/03 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
2018/12/07 PHP
PHP 8新特性简介
2020/08/18 PHP
Tab页界面,用jQuery及Ajax技术实现
2009/09/21 Javascript
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
在百度知道团队中快速审批新成员的js脚本
2014/02/02 Javascript
jquery显示隐藏input对象
2014/07/21 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
2016/08/23 Javascript
Boostrap基础教程之JavaScript插件篇
2016/09/08 Javascript
KnockoutJS 3.X API 第四章之数据控制流foreach绑定
2016/10/10 Javascript
DOM 事件的深入浅出(二)
2016/12/05 Javascript
JavaScript中的call和apply的用途以及区别
2017/01/11 Javascript
JS实现的简单表单验证功能示例
2017/10/13 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
使用apifm-wxapi模块中的问题及解决方法
2019/08/05 Javascript
移动端手指操控左右滑动的菜单
2019/09/08 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
2019/10/25 Javascript
在react中使用vue的状态管理的方法示例
2020/05/02 Javascript
jQuery 移除事件的方法
2020/06/20 jQuery
[57:16]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第二场
2014/05/26 DOTA
[00:31]2016完美“圣”典风云人物:国士无双宣传片
2016/12/04 DOTA
使用Pyrex来扩展和加速Python程序的教程
2015/04/13 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
Python分割训练集和测试集的方法示例
2019/09/19 Python
python自动化办公操作PPT的实现
2021/02/05 Python
德国体育用品网上商店:SC24.com
2016/08/01 全球购物
世界上最悠久的自行车制造商:Ribble Cycles
2017/03/18 全球购物
UNIX文件系统分类
2014/11/11 面试题
教师自我剖析材料范文
2014/09/30 职场文书
2016中秋晚会开幕词
2016/03/03 职场文书
springboot @ConfigurationProperties和@PropertySource的区别
2021/06/11 Java/Android
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL
Spring Boot 的创建和运行示例代码详解
2022/07/23 Java/Android