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)四
Oct 09 PHP
追求程序速度,而不是编程的速度
Apr 23 PHP
PHP 强制性文件下载功能的函数代码(任意文件格式)
May 26 PHP
PHP 可阅读随机字符串代码
May 26 PHP
用PHP编写和读取XML的几种方式
Jan 12 PHP
PHP实现的封装验证码类详解
Jun 18 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
Nov 20 PHP
php使用cookie保存登录用户名的方法
Jan 26 PHP
PHP实现的简单对称加密与解密方法实例小结
Aug 28 PHP
Yii2框架实现登录、退出及自动登录功能的方法详解
Oct 24 PHP
php 可变函数使用小结
Jun 12 PHP
PHP开发API接口签名生成及验证操作示例
May 27 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
php+ajax做仿百度搜索下拉自动提示框(有实例)
2012/08/21 PHP
解析在PHP中使用mysqli扩展库对mysql的操作
2013/07/03 PHP
php实现带读写分离功能的MySQL类完整实例
2016/07/28 PHP
ExtJs之带图片的下拉列表框插件
2010/03/04 Javascript
JSON辅助格式化处理方法
2013/03/26 Javascript
基于socket.io和node.js搭建即时通信系统
2014/07/30 Javascript
jQuery Ajax 加载数据时异步显示加载动画
2016/08/01 Javascript
Node.js测试中的Mock文件系统详解
2016/11/21 Javascript
Bootstrap栅格系统学习笔记
2016/11/25 Javascript
解决JQuery全选/反选第二次失效的问题
2017/10/11 jQuery
详解VUE-地区选择器(V-Distpicker)组件使用心得
2018/05/07 Javascript
Nodejs实现多文件夹文件同步
2018/10/17 NodeJs
JavaScript中关于base64的一些事
2019/05/06 Javascript
Vue-cli3.x + axios 跨域方案踩坑指北
2019/07/04 Javascript
js数据类型转换与流程控制操作实例分析
2019/12/18 Javascript
Vue 电商后台管理项目阶段性总结(推荐)
2020/08/22 Javascript
JavaScript大数相加相乘的实现方法实例
2020/10/18 Javascript
微信小程序自定义胶囊样式
2020/12/27 Javascript
[46:04]Liquid vs VP Supermajor决赛 BO 第四场 6.10
2018/07/05 DOTA
浅析Python中的join()方法的使用
2015/05/19 Python
利用python批量检查网站的可用性
2016/09/09 Python
python 对类的成员函数开启线程的方法
2019/01/22 Python
python实现输入任意一个大写字母生成金字塔的示例
2019/10/27 Python
Python集合操作方法详解
2020/02/09 Python
解决pycharm中导入自己写的.py函数出错问题
2020/02/12 Python
关于tf.TFRecordReader()函数的用法解析
2020/02/17 Python
Opencv常见图像格式Data Type及代码实例
2020/11/02 Python
Born鞋子官网:Born Shoes
2017/04/06 全球购物
英国网上购买门:Direct Doors
2018/06/07 全球购物
大专计算机个人求职的自我评价
2013/10/21 职场文书
大学生实习鉴定评语
2014/04/25 职场文书
大足石刻导游词
2015/02/02 职场文书
建筑安全员岗位职责
2015/02/15 职场文书
2015年度党员自我评价范文
2015/03/03 职场文书
简单聊聊Golang中defer预计算参数
2022/03/25 Golang
Android Studio 计算器开发
2022/05/20 Java/Android