PHP通过加锁实现并发情况下抢码功能


Posted in PHP onAugust 10, 2016

需求:抢码功能

要求:

1、特定时间段才开放抢码;

2、每个时间段放开的码是有限的;

3、每个码不允许重复;

实现:

1、在不考虑并发的情况下实现:

function get_code($len){
$CHAR_ARR = array('1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','X','Y','Z','W','S','R','T');
$CHAR_ARR_LEN = count($CHAR_ARR) - 1;
$code = '';
while(--$len > 0){ $code .= $CHAR_ARR[rand(0,$CHAR_ARR_LEN)]; }
return $code;
}
$pdo = new PDO('mysql:host=localhost;dbname=ci_test','root','root');
//查询当前时间已发放验证码数量
$code_num_rs = $pdo->query("SELECT COUNT(*) as sum FROM code_test");
$code_num_arr = $code_num_rs->fetch(PDO::FETCH_ASSOC);
$code_num = $code_num_arr['sum'];
if($code_num < 1){<br> sleep(2); //暂停2秒
$code = get_code(6);
var_dump( $pdo->query("INSERT INTO code_test (code,create_time) VALUES ('$code',".time().")") );
}

上述代码默认满足当前是开放时间,和码是不重复的; 

     在不考虑并发情况下流程:

1)选查询当前数据库发放的验证码数量;

2)如果还有名额,则生成验证码,插入到数据库,返回验证码到客户端;

3)如果已满;则返回提示,已无名额;

2、并发情况下实现:

那么看下上面代码在并发情况下得到的结果:

测试并发,可以使用apache benchmark来测试,apache benchmark是APACHE旗下的HTTP SERVER的性能评测工具,通过cmd进入到apche的bin目录下,通过ab命令调用,如:ab -c 并发数量 -n 总访问量 url

cb -c 100 -n 100 http://localhost/php_mulit.php

这样就是100个用户同事去抢1个名额,在查询的时候,每个用户都查询到还有一个名额,则会去生成验证码,插入数据库,返回验证码;这样就造成了验证码发多了。事实上,运行完该命令,数据库多了13条记录,而不是一条。

怎么避免这情况发生呢? 

     可以通过加排他锁来锁定判断到插入这个过程,保证这个判断流程任意一时间只有一个进程在运行。实现如下:

//生成码
function get_code($len){
$CHAR_ARR = array('1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','X','Y','Z','W','S','R','T');
$CHAR_ARR_LEN = count($CHAR_ARR) - 1;
$code = '';
while(--$len > 0){ $code .= $CHAR_ARR[rand(0,$CHAR_ARR_LEN)]; }
return $code;
}
$pdo = new PDO('mysql:host=localhost;dbname=ci_test','root','root');
$fp = fopen('lock.txt','r');
//通过排他锁 锁定该过程
if(flock($fp,LOCK_EX)){
//查询当前时间已发放验证码数量
$code_num_rs = $pdo->query("SELECT COUNT(*) as sum FROM code_test");
$code_num_arr = $code_num_rs->fetch(PDO::FETCH_ASSOC);
$code_num = $code_num_arr['sum'];
if($code_num < 1){
sleep(2);
$code = get_code(6);
var_dump( $pdo->query("INSERT INTO code_test (code,create_time) VALUES ('$code',".time().")") );
}
flock($fp,LOCK_UN);
fclose($fp);
}

通过flock函数来锁定该过程。

更多flock信息可以参考php手册:http://php.net/manual/zh/function.flock.php

再次运行

cb -c 100 -n 100 http://localhost/php_mulit.php

数据库只增加了一条记录,保证了并发情况下数据的正确。

以上所述是小编给大家介绍的PHP通过加锁实现并发情况下抢码功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
php连接mysql数据库代码
Mar 10 PHP
php 静态变量的初始化
Nov 15 PHP
PHP错误抑制符(@)导致引用传参失败Bug的分析
May 02 PHP
PHP session会话的安全性分析
Sep 08 PHP
解析PHP自带的进位制之间的转换函数
Jun 08 PHP
PHP之uniqid()函数用法
Nov 03 PHP
PHP请求Socket接口测试实例
Aug 12 PHP
php使用CutyCapt实现网页截图保存的方法
Oct 03 PHP
thinkPHP多语言切换设置方法详解
Nov 11 PHP
php中static 静态变量和普通变量的区别
Dec 01 PHP
Laravel5.5新特性之友好报错以及展示详解
Aug 13 PHP
laravel实现上传图片的两种方式小结
Oct 12 PHP
PHP身份证校验码计算方法
Aug 10 #PHP
PHP5.4起内置web服务器使用方法
Aug 09 #PHP
PHP Filter过滤器全面解析
Aug 09 #PHP
学习PHP Cookie处理函数
Aug 09 #PHP
利用PHP命令行模式采集股票趋势信息
Aug 09 #PHP
PHP怎样用正则抓取页面中的网址
Aug 09 #PHP
php阳历转农历优化版
Aug 08 #PHP
You might like
PHP实现的简单mock json脚本分享
2015/02/10 PHP
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
2016/12/27 PHP
从js向Action传中文参数出现乱码问题的解决方法
2013/12/29 Javascript
js阻止事件追加的具体实现
2014/10/15 Javascript
jQuery中outerWidth()方法用法实例
2015/01/19 Javascript
jquery实现表单验证简单实例演示
2015/11/23 Javascript
值得分享的轻量级Bootstrap Table表格插件
2016/05/30 Javascript
jquery插件方式实现table查询功能的简单实例
2016/06/06 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
vue2实现移动端上传、预览、压缩图片解决拍照旋转问题
2017/04/13 Javascript
vue 怎么创建组件及组件使用方法
2017/07/27 Javascript
webpack实现热加载自动刷新的方法
2017/07/30 Javascript
jQuery实现的简单无刷新评论功能示例
2017/11/08 jQuery
微信公众号平台接口开发 菜单管理的实现
2019/08/14 Javascript
JS实现密码框效果
2020/09/10 Javascript
[15:39]教你分分钟做大人:龙骑士
2014/10/30 DOTA
Python+matplotlib实现计算两个信号的交叉谱密度实例
2018/01/08 Python
python实现画圆功能
2018/01/25 Python
python取代netcat过程分析
2018/02/10 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
Python 的AES加密与解密实现
2019/07/09 Python
基于Python解密仿射密码
2019/10/21 Python
python 识别登录验证码图片功能的实现代码(完整代码)
2020/07/03 Python
大数据分析用java还是Python
2020/07/06 Python
Python连接mysql数据库及简单增删改查操作示例代码
2020/08/03 Python
python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)
2020/12/03 Python
python 根据列表批量下载网易云音乐的免费音乐
2020/12/03 Python
应届生会计电算化求职信
2013/10/03 职场文书
英文留学推荐信范文
2014/01/25 职场文书
优质服务口号
2014/06/11 职场文书
网吧七夕活动策划方案
2014/08/31 职场文书
招标保密承诺书
2015/01/20 职场文书
社区义诊通知
2015/04/24 职场文书
导游词之阳朔遇龙河
2019/12/16 职场文书
Python insert() / append() 用法 Leetcode实战演示
2021/03/31 Python