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 相关文章推荐
关于文本留言本的分页代码
Oct 09 PHP
PHP输出数组中重名的元素的几种处理方法
Sep 05 PHP
php函数array_merge用法一例(合并同类数组)
Feb 03 PHP
取得单条网站评论以数组形式进行输出
Jul 28 PHP
教大家制作简单的php日历
Nov 17 PHP
WordPress中给媒体文件添加分类和标签的PHP功能实现
Dec 31 PHP
Yii视图CGridView实现操作按钮定义地址示例
Jul 14 PHP
php 实现301重定向跳转实例代码
Jul 18 PHP
PHP 实现从数据库导出到.csv文件方法
Jul 06 PHP
Laravel框架实现多数据库连接操作详解
Jul 12 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
Oct 24 PHP
解决Laravel使用验证时跳转到首页的问题
Nov 17 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
SSO单点登录的PHP实现方法(Laravel框架)
2016/03/23 PHP
“不能执行已释放的Script代码”错误的原因及解决办法
2007/09/09 Javascript
JavaScript 通过模式匹配实现重载
2010/08/12 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
2015/02/20 Javascript
jQuery插件MixItUp实现动画过滤和排序
2015/04/12 Javascript
JavaScript中constructor()方法的使用简介
2015/06/05 Javascript
轻松实现javascript数据双向绑定
2015/11/11 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
js图片上传前预览功能(兼容所有浏览器)
2016/08/24 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
2016/09/16 Javascript
快速解决js开发下拉框中blur与click冲突
2016/10/10 Javascript
Vue.js组件tree实现省市多级联动
2016/12/02 Javascript
使用微信小程序开发前端【快速入门】
2016/12/05 Javascript
完美解决浏览器跨域的几种方法(汇总)
2017/05/08 Javascript
微信小程序实现倒计时60s获取验证码
2020/04/17 Javascript
JS实现非首屏图片延迟加载的示例
2018/01/06 Javascript
基于jQuery实现的设置文本区域的光标位置
2018/06/15 jQuery
vue中element 上传功能的实现思路
2018/07/06 Javascript
JS实现继承的几种常用方式示例
2019/06/22 Javascript
python使用super()出现错误解决办法
2017/08/14 Python
python安装twisted的问题解析
2018/08/21 Python
Python OS模块实例详解
2019/04/15 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
2019/09/16 Python
python银行系统实现源码
2019/10/25 Python
使用pyshp包进行shapefile文件修改的例子
2019/12/06 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
2020/07/18 Python
Python常用数据分析模块原理解析
2020/07/20 Python
三星美国官网:Samsung美国
2017/02/06 全球购物
印度尼西亚手表和包包商店:Urban Icon
2019/12/12 全球购物
奠基仪式主持词
2014/03/20 职场文书
股权转让协议书范本
2014/04/12 职场文书
音乐教育专业自荐信
2014/09/18 职场文书
医院合作意向书范本
2015/05/08 职场文书
运动会宣传稿100字
2015/07/23 职场文书
高中政治教学反思
2016/02/23 职场文书
分享五个Node.js开发的优秀实践 
2022/04/07 NodeJs