PHP开发中解决并发问题的几种实现方法分析


Posted in PHP onNovember 13, 2017

本文实例讲述了PHP开发中解决并发问题的几种实现方法。分享给大家供大家参考,具体如下:

对于商品抢购等并发场景下,可能会出现超卖的现象,这时就需要解决并发所带来的这些问题了

在PHP语言中并没有原生的提供并发的解决方案,因此就需要借助其他方式来实现并发控制。

方案一:使用文件锁排它锁

flock函数用于获取文件的锁,这个锁同时只能被一个线程获取到,其它没有获取到锁的线程要么阻塞,要么获取失败

在获取到锁的时候,先查询库存,如果库存大于0,则进行下订单操作,减库存,然后释放锁

方案二:使用Mysql数据库提供的悲观锁

Innodb存储引擎支持行级锁,当某行数据被锁定时,其他进程不能对这行数据进行操作

先查询并锁定行:

select stock_num from table where id=1 for update
if(stock_num > 0){
//下订单
update table set stock_num=stock-1 where id=1
}

方案三:使用队列

将用户的下单请求依次存入一个队列中,后台用一个单独的进程处理队列中的下单请求

方案四:使用Redis

redis的操作都是原子性的,可以将商品的库存存入redis中,下单之前对库存进行decr操作,如果返回的值大于等于0等可以下单,否则不能下单,这种方式效率较高

if(redis->get('stock_num') > 0){
 stock_num = redis->decr('stock_num')
 if(stock_num >= 0){
 //下订单
 }else{
 //库存不足
 }
}else{
//库存不足
}

其他并发问题:

在现实应用中,很多情况下会把数据存入缓存,当缓存失效时,去数据库取数据并重新设置缓存,如果这时并发量很大,会有很多进程同时去数据库取数据,导致很多请求

穿透到数据库,而使数据库奔溃,这里可用文件锁来解决

$data = $cache->get('key');
if(!$data){
  $fp = fopen('lockfile');
  if(flock($fp, LOCK_EX)){
    $data = $cache->get('key');//拿到锁后再次检查缓存,这时可能已经有了
    if(!$data){
      $data = mysql->query();
      $cache->set('key', $data);
    }
    flock($fp, LOCK_UN);
  }
  fclose($fp);
}

说白了,要解决并发问题就必须要加锁,各种方案的本质都是加锁

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

PHP 相关文章推荐
PHP投票系统防刷票判断流程分析
Feb 04 PHP
php 在windows下配置虚拟目录的方法介绍
Jun 26 PHP
Yii2.0高级框架数据库增删改查的一些操作
Nov 16 PHP
PHP安装threads多线程扩展基础教程
Nov 17 PHP
php中的登陆login实例代码
Jun 20 PHP
ThinkPHP中session函数详解
Sep 14 PHP
php 如何禁用eval() 函数实例详解
Dec 01 PHP
PHP面向对象程序设计继承用法简单示例
Dec 28 PHP
PHP chr()函数讲解
Feb 11 PHP
浅谈php://filter的妙用
Mar 05 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
Feb 21 PHP
PHP代码加密的方法总结
Mar 13 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 #PHP
kindeditor 加入七牛云上传的实例讲解
Nov 12 #PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
Nov 12 #PHP
PHP 断点续传实例详解
Nov 11 #PHP
PHP+AJAX 投票器功能
Nov 11 #PHP
PHP实现双链表删除与插入节点的方法示例
Nov 11 #PHP
PHP实现基于栈的后缀表达式求值功能
Nov 10 #PHP
You might like
非常不错的MySQL优化的8条经验
2008/03/24 PHP
PHP常用函数小技巧
2008/09/11 PHP
php文件上传表单摘自drupal的代码
2011/02/15 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
node.js中的querystring.unescape方法使用说明
2014/12/10 Javascript
3种js实现string的substring方法
2015/11/09 Javascript
JavaScript中各种引用类型的常用操作方法小结
2016/05/05 Javascript
Jquery UI实现一次拖拽多个选中的元素操作
2020/12/01 Javascript
canvas实现图像放大镜
2017/02/06 Javascript
使用vue框架 Ajax获取数据列表并用BootStrap显示出来
2017/04/24 Javascript
Vue实现双向数据绑定
2017/05/03 Javascript
Vue.js 表单控件操作小结
2018/03/29 Javascript
JS中注入eval, Function等系统函数截获动态代码
2019/04/03 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
2019/09/06 Javascript
javascript实现简易数码时钟
2020/03/30 Javascript
vue通过过滤器实现数据格式化
2020/07/20 Javascript
react+antd 递归实现树状目录操作
2020/11/02 Javascript
[03:39]2015国际邀请赛主赛事首日精彩回顾
2015/08/05 DOTA
python自动化测试之连接几组测试包实例
2014/09/28 Python
python算法与数据结构之冒泡排序实例详解
2019/06/22 Python
Python异常模块traceback用法实例分析
2019/10/22 Python
pytorch torch.expand和torch.repeat的区别详解
2019/11/05 Python
python实现简单井字棋小游戏
2020/03/05 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
2020/07/09 Python
深入了解Python 方法之类方法 & 静态方法
2020/08/17 Python
CSS3中Color的一些特性介绍
2012/05/27 HTML / CSS
Kathmandu澳洲户外商店:新西兰户外运动品牌
2017/11/12 全球购物
电子商务专业个人的自我评价
2013/11/19 职场文书
施工安全责任书
2014/04/14 职场文书
公司合作意向书范文
2014/07/30 职场文书
喝酒驾驶检讨书
2014/10/01 职场文书
办理护照工作证明
2014/10/10 职场文书
王金山在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
2015年高校教师个人工作总结
2015/05/25 职场文书
施工安全协议书
2016/03/22 职场文书