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+mysql实现无限级分类 | 树型显示分类关系
Nov 19 PHP
抓取YAHOO股票报价的类
May 15 PHP
PHP XML备份Mysql数据库
May 27 PHP
php curl post 时出现的问题解决
Jan 30 PHP
PHP中unset,array_splice删除数组中元素的区别
Jul 28 PHP
php中隐形字符65279(utf-8的BOM头)问题
Aug 16 PHP
使用PHP Socket 编程模拟Http post和get请求
Nov 25 PHP
微信支付开发动态链接Native支付
Jul 12 PHP
PHP使用strrev翻转中文乱码问题的解决方法
Jan 13 PHP
PHP 获取指定地区的天气实例代码
Feb 08 PHP
Laravel中encrypt和decrypt的实现方法
Sep 24 PHP
laravel实现上传图片的两种方式小结
Oct 12 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
9段PHP实用功能的代码推荐
2014/10/14 PHP
CentOS安装php v8js教程
2015/02/26 PHP
php获取访问者IP地址汇总
2015/04/24 PHP
定义select的边框颜色
2008/04/28 Javascript
javascript 强制刷新页面的实现代码
2009/12/13 Javascript
javascript与cookie 的问题详解
2013/11/11 Javascript
js获取checkbox值的方法
2015/01/28 Javascript
JS实现向表格中动态添加行的方法
2015/03/30 Javascript
jQuery实现按钮只点击一次后就取消点击事件绑定的方法
2015/06/26 Javascript
JS实现不规则TAB选项卡效果代码
2015/09/16 Javascript
jQuery侧边栏实现代码
2016/05/06 Javascript
AngularJS ng-bind 指令简单实现
2016/07/30 Javascript
Bootstrap警告框(Alert)插件使用方法
2017/03/21 Javascript
ES6 Promise对象概念与用法分析
2017/04/01 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
2017/08/14 Javascript
Vue中引入样式文件的方法
2017/08/18 Javascript
浅谈JavaScript面向对象--继承
2019/03/20 Javascript
浅入深出Vue之组件使用
2019/07/11 Javascript
webpack是如何实现模块化加载的方法
2019/11/06 Javascript
Vue快速实现通用表单验证功能
2019/12/05 Javascript
Python实现小数转化为百分数的格式化输出方法示例
2017/09/20 Python
Python实现按照指定要求逆序输出一个数字的方法
2018/04/19 Python
解决python xlrd无法读取excel文件的问题
2018/12/25 Python
在Python中使用MySQL--PyMySQL的基本使用方法
2019/11/19 Python
Python Django2.0集成Celery4.1教程
2019/11/19 Python
浅谈python之自动化运维(Paramiko)
2020/01/31 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
python 如何使用find和find_all爬虫、找文本的实现
2020/10/16 Python
a标签下载链接的简单实现
2016/09/13 HTML / CSS
Eastbay官网:美国最大的运动鞋网络零售商
2016/07/27 全球购物
水污染治理专业毕业生推荐信
2013/11/14 职场文书
外贸业务员求职信范文
2013/12/12 职场文书
公务员更新知识培训实施方案
2014/03/31 职场文书
防灾减灾活动总结
2014/08/30 职场文书
2019广播稿怎么写
2019/04/17 职场文书
React Fragment介绍与使用详解
2021/11/11 Javascript