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 相关文章推荐
在Windows中安装Apache2和PHP4的权威指南
Oct 09 PHP
聊天室php&mysql(三)
Oct 09 PHP
利用PHP制作简单的内容采集器的代码
Nov 28 PHP
PHP 存储文本换行实现方法
Jan 05 PHP
PHP取得一个类的属性和方法的实现代码
May 22 PHP
Php中用PDO查询Mysql来避免SQL注入风险的方法
Apr 25 PHP
PHP设计模式之责任链模式的深入解析
Jun 13 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
May 10 PHP
推荐十款免费 WordPress 插件
Mar 24 PHP
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
Dec 21 PHP
iOS+PHP注册登录系统 PHP部分(上)
Dec 26 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
Sep 01 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
德生PL330的评价与改造
2021/03/02 无线电
php发送post请求函数分享
2014/03/06 PHP
php类中的各种拦截器用法分析
2014/11/03 PHP
PHP5.6读写excel表格文件操作示例
2019/02/26 PHP
jQuery EasyUI API 中文文档 - ValidateBox验证框
2011/10/06 Javascript
js修改input的type属性及浏览器兼容问题探讨与解决
2013/01/23 Javascript
Js冒泡事件详解及阻止示例
2014/03/21 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
2014/06/16 Javascript
Javascript核心读书有感之表达式和运算符
2015/02/11 Javascript
基于jquery实现页面滚动时顶部导航显示隐藏
2020/04/20 Javascript
JavaScrip常见的一些算法总结
2015/12/28 Javascript
PHP+jquery+ajax实现分页
2016/12/09 Javascript
Node.js制作简单聊天室
2017/01/12 Javascript
layui框架中layer父子页面交互的方法分析
2017/11/15 Javascript
JS实现关键词高亮显示正则匹配
2018/06/22 Javascript
vue-cli 3.0 自定义vue.config.js文件,多页构建的方法
2018/09/19 Javascript
微信小程序 select 下拉框组件功能
2019/09/09 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
2020/09/09 Javascript
利用node.js开发cli的完整步骤
2020/12/29 Javascript
[05:29]2014DOTA2国际邀请赛 赛后专访:LGDNewbee顺利过关
2014/07/13 DOTA
Flask框架中密码的加盐哈希加密和验证功能的用法详解
2016/06/07 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
Python 支持向量机分类器的实现
2020/01/15 Python
python实现逢七拍腿小游戏的思路详解
2020/05/26 Python
HTML5 本地存储和内容按需加载的思路和方法
2011/04/07 HTML / CSS
canvas 实现 github404动态效果的示例代码
2017/11/15 HTML / CSS
京东国际站:JOYBUY
2017/11/23 全球购物
StudentUniverse英国:学生航班、酒店和旅游
2019/08/25 全球购物
Wiggle澳大利亚:自行车、跑步、游泳商店
2020/11/07 全球购物
同学聚会老师邀请函
2014/01/28 职场文书
机电一体化专业求职信
2014/07/22 职场文书
四风问题对照检查材料思想汇报
2014/10/07 职场文书
运动会广播稿200字(10篇)
2014/10/12 职场文书
干部个人考察材料
2014/12/24 职场文书
高中班主任心得体会
2016/01/07 职场文书
python中if和elif的区别介绍
2021/11/07 Python