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开发过程中常用函数收藏
Dec 14 PHP
PHP 图片文件上传实现代码
Dec 29 PHP
php json_encode奇怪问题说明
Sep 27 PHP
PHP的array_diff()函数在处理大数组时的效率问题
Nov 27 PHP
解析php安全性问题中的:Null 字符问题
Jun 21 PHP
PHP 之 写时复制介绍(Copy On Write)
May 13 PHP
PHP学习笔记之字符串编码的转换和判断
May 22 PHP
PHP实现即时输出、实时输出内容方法
May 27 PHP
Symfony2学习笔记之控制器用法详解
Mar 17 PHP
PHP基于socket实现客户端和服务端通讯功能
Jul 13 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
PHP基于phpqrcode类生成二维码的方法示例详解
Aug 07 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
提问的智慧(2)
2006/10/09 PHP
Ajax+PHP快速上手及简单应用说明
2013/07/24 PHP
php实现通用的信用卡验证类
2015/03/24 PHP
向fckeditor编辑器插入指定代码的方法
2007/05/25 Javascript
不错的JS中变量相关的细节分析
2007/08/13 Javascript
传递参数的标准方法(jQuery.ajax)
2008/11/19 Javascript
flash 得到自身url参数的代码
2009/11/15 Javascript
javascript date格式化示例
2013/09/25 Javascript
JQUERY表单暂存功能插件分享
2016/02/23 Javascript
Vue.js基础学习之class与样式绑定
2017/03/20 Javascript
JS实现的简单四则运算计算器功能示例
2017/09/27 Javascript
Node.js引入UIBootstrap的方法示例
2018/05/11 Javascript
karma+webpack搭建vue单元测试环境的方法示例
2018/05/24 Javascript
vue-cli项目修改文件热重载失效的解决方法
2018/09/19 Javascript
Vue+Typescript中在Vue上挂载axios使用时报错问题
2019/08/07 Javascript
微信小程序实现侧边栏分类
2019/10/21 Javascript
JS判断浏览器类型与操作系统的方法分析
2020/04/30 Javascript
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
使用Python的web.py框架实现类似Django的ORM查询的教程
2015/05/02 Python
Python实现针对含中文字符串的截取功能示例
2017/09/22 Python
python3实现点餐系统
2019/01/24 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
使用python分析统计自己微信朋友的信息
2019/07/19 Python
详解Python绘图Turtle库
2019/10/12 Python
Python 实现加密过的PDF文件转WORD格式
2020/02/04 Python
详解HTML5 Canvas绘制不规则图形时的非零环绕原则
2016/03/21 HTML / CSS
财务会计专业毕业生自荐信
2013/10/19 职场文书
毕业自我评价范文
2013/11/17 职场文书
求职信的最佳写作思路
2014/02/01 职场文书
校园歌咏比赛主持词
2014/03/18 职场文书
公证书样本
2014/04/10 职场文书
乡镇党员干部群众路线对照检查材料思想汇报
2014/09/28 职场文书
民主生活会汇报材料
2014/12/15 职场文书
优秀班主任事迹材料
2014/12/16 职场文书
《纸船和风筝》教学反思
2016/02/18 职场文书
在python中读取和写入CSV文件详情
2022/06/28 Python