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 相关文章推荐
动易数据转成dedecms的php程序
Apr 07 PHP
fleaphp下不确定的多条件查询的巧妙解决方法
Sep 11 PHP
浅析PHP递归函数返回值使用方法
Feb 18 PHP
php使用类继承解决代码重复的问题
Feb 11 PHP
PHP变量赋值、代入给JavaScript中的变量
Jun 29 PHP
PHP环境中Memcache的安装和使用
Nov 05 PHP
Yii2中datetime类的使用
Dec 17 PHP
详解Yii2高级版引入bootstrap.js的一个办法
Mar 21 PHP
Yii2 队列 shmilyzxt/yii2-queue 简单概述
Aug 02 PHP
php实现解析xml并生成sql语句的方法
Feb 03 PHP
PHP的curl函数的用法总结
Feb 14 PHP
PHP二维数组分页2种实现方法解析
Jul 09 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 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
2013/06/18 PHP
简单谈谈PHP中strlen 函数
2016/02/27 PHP
php版微信公众号自定义分享内容实现方法
2016/09/22 PHP
php自定义截取中文字符串-utf8版
2017/02/27 PHP
Redis构建分布式锁
2017/03/28 PHP
让你的网站可编辑的实现js代码
2009/10/19 Javascript
模拟jQuery ajax服务器端与客户端通信的代码
2011/03/28 Javascript
浅析js设置控件的readonly与enabled属性问题
2013/12/25 Javascript
javascript判断css3动画结束 css3动画结束的回调函数
2015/03/10 Javascript
JavaScript获得指定对象大小的方法
2015/07/01 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
vue实现可增删查改的成绩单
2016/10/27 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
React Native如何消除启动时白屏的方法
2017/08/08 Javascript
Vue2.0用户权限控制解决方案
2017/11/29 Javascript
vue小白入门教程
2018/04/02 Javascript
JS拖拽排序插件Sortable.js用法实例分析
2019/02/20 Javascript
Vue-cli项目部署到Nginx服务器的方法
2019/11/01 Javascript
Vue2.0 $set()的正确使用详解
2020/07/28 Javascript
原生JavaScript实现留言板
2021/01/10 Javascript
Python实现删除文件中含“指定内容”的行示例
2017/06/09 Python
python获取本机所有IP地址的方法
2018/12/26 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
2020/10/29 Python
康拓普公司Java笔面试
2016/09/23 面试题
记者岗位职责
2014/01/06 职场文书
创业计划书的写作技巧及要点
2014/01/31 职场文书
终止劳动合同协议书
2014/04/14 职场文书
初中升旗仪式演讲稿
2014/05/08 职场文书
2014年党员干部四风问题自我剖析材料
2014/09/29 职场文书
群众路线教育实践活动心得体会(四风)
2014/11/03 职场文书
会议接待欢迎词范文
2015/01/26 职场文书
公司经营目标责任书
2015/01/29 职场文书
红歌会主持词
2015/07/02 职场文书
2015年城乡环境综合治理工作总结
2015/07/24 职场文书
工作建议书范文
2019/07/08 职场文书
利用JavaScript写一个简单计算器
2021/11/27 Javascript