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之第五天
Oct 09 PHP
php数据结构与算法(PHP描述) 快速排序 quick sort
Jun 21 PHP
解析在apache里面给php写虚拟目录的详细方法
Jun 24 PHP
php判断电脑访问、手机访问的例子
May 10 PHP
Zend Framework 2.0事件管理器(The EventManager)入门教程
Aug 11 PHP
PHP数组排序之sort、asort与ksort用法实例
Sep 08 PHP
smarty模板引擎中变量及变量修饰器用法实例
Jan 22 PHP
php输出xml属性的方法
Mar 19 PHP
php循环table实现一行两列显示的方法
Jun 04 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
Jan 11 PHP
php实用代码片段整理
Nov 12 PHP
PHP 二维关联数组根据其中一个字段排序(推荐)
Apr 04 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下通过系统信号量加锁方式获取递增序列ID
2009/09/25 PHP
php使用glob函数遍历文件和目录详解
2016/09/23 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
PHP join()函数用法与实例讲解
2019/03/11 PHP
php简单计算权重的方法示例【适合抽奖类应用】
2019/06/10 PHP
mouse_on_title.js
2006/08/25 Javascript
常用一些Javascript判断函数
2012/08/14 Javascript
JavaScript之Getters和Setters 平台支持等详细介绍
2012/12/07 Javascript
在JavaScript中typeof的用途介绍
2013/04/11 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
JavaScript检测浏览器cookie是否已经启动的方法
2015/02/27 Javascript
基于bootstrap3和jquery的分页插件
2015/07/31 Javascript
jQuery+canvas实现简单的球体斜抛及颜色动态变换效果
2016/01/28 Javascript
jQuery select自动选中功能实现方法分析
2016/11/28 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
2016/12/14 Javascript
js变量声明var使用与不使用的区别详解
2019/01/21 Javascript
vue+elementui通用弹窗的实现(新增+编辑)
2021/01/07 Vue.js
[00:27]DOTA2战队VP、Secret贺新春
2018/02/11 DOTA
python实现的jpg格式图片修复代码
2015/04/21 Python
python实现的系统实用log类实例
2015/06/30 Python
python简单判断序列是否为空的方法
2015/06/30 Python
Python打包可执行文件的方法详解
2016/09/19 Python
Python:Numpy 求平均向量的实例
2019/06/29 Python
Python django框架开发发布会签到系统(web开发)
2020/02/12 Python
用Python实现职工信息管理系统
2020/12/30 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
2021/01/27 Python
python实现简单的学生管理系统
2021/02/22 Python
《在山的那边》教学反思
2014/02/23 职场文书
工程项目建议书范文
2014/03/12 职场文书
总经理助理的职责
2014/03/14 职场文书
婚礼秀策划方案
2014/05/19 职场文书
十八大演讲稿
2014/05/22 职场文书
2014年财务工作自我评价
2014/09/23 职场文书
三严三实民主生活会发言稿
2014/10/13 职场文书
发言稿之优秀教师篇
2019/09/26 职场文书
Python离线安装openpyxl模块的步骤
2021/03/30 Python