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中修改浏览器的User-Agent来伪装你的浏览器和操作系统
Jul 29 PHP
php遍历数组的方法分享
Mar 22 PHP
Php中文件下载功能实现超详细流程分析
Jun 13 PHP
深入解析php之sphinx
May 15 PHP
php简单获取文件扩展名的方法
Mar 24 PHP
php生成rss类用法实例
Apr 14 PHP
详解HTTP Cookie状态管理机制
Jan 14 PHP
PHP Cookei记录用户历史浏览信息的代码
Feb 03 PHP
php排序算法实例分析
Oct 17 PHP
PHP foreach遍历多维数组实现方式
Nov 16 PHP
由php中字符offset特征造成的绕过漏洞详解
Jul 07 PHP
php新建文件的方法实例
Sep 26 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
zend framework重定向方法小结
2016/05/28 PHP
jQuery使用手册之 事件处理
2007/03/24 Javascript
node.js中的querystring.parse方法使用说明
2014/12/10 Javascript
利用JavaScript脚本实现滚屏效果的方法
2015/07/07 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
2016/07/05 Javascript
js HTML5手机刮刮乐代码
2020/09/29 Javascript
基于JavaScript实现购物车功能
2017/02/07 Javascript
jq checkbox 的全选并ajax传参的实例
2017/04/01 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
Node.js API详解之 string_decoder用法实例分析
2020/04/29 Javascript
vue+elementUI 实现内容区域高度自适应的示例
2020/09/26 Javascript
跟老齐学Python之用Python计算
2014/09/12 Python
Python标准库os.path包、glob包使用实例
2014/11/25 Python
初步剖析C语言编程中的结构体
2016/01/16 Python
Python脚本实现Web漏洞扫描工具
2016/10/25 Python
json跨域调用python的方法详解
2017/01/11 Python
Python三种遍历文件目录的方法实例代码
2018/01/19 Python
django进阶之cookie和session的使用示例
2018/08/17 Python
python网络爬虫 CrawlSpider使用详解
2019/09/27 Python
tensorflow指定GPU与动态分配GPU memory设置
2020/02/03 Python
Python第三方包之DingDingBot钉钉机器人
2020/04/09 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
如何在python中实现线性回归
2020/08/10 Python
购买限量版收藏品、珠宝和礼品:Bradford Exchange
2016/09/23 全球购物
大女孩胸罩:Big Girls Bras
2016/12/15 全球购物
The Hut英国:英国领先的豪华在线百货商店
2019/07/26 全球购物
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
企业管理专业个人求职信范文
2013/09/24 职场文书
夜大毕业生自我评价分享
2013/11/10 职场文书
管理站站长岗位职责
2013/11/27 职场文书
高中美术教师事迹材料
2014/08/22 职场文书
小学红领巾广播稿(3篇)
2014/09/13 职场文书
未婚证明书模板
2014/10/08 职场文书
乔迁之喜答谢词
2015/01/05 职场文书
2015年乡镇纪委工作总结
2015/05/26 职场文书