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 闭包特性在实际应用中的问题
Oct 30 PHP
PHP学习之整理字符串
Apr 17 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
Feb 21 PHP
PHP中ob_start函数的使用说明
Nov 11 PHP
PHP采集静态页面并把页面css,img,js保存的方法
Dec 23 PHP
网站防止被刷票的一些思路与方法
Jan 08 PHP
PHP加密解密实例分析
Dec 25 PHP
php制作的简单验证码识别代码
Jan 26 PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
Feb 26 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
Apr 07 PHP
Thinkphp框架开发移动端接口(1)
Aug 18 PHP
简单实现php上传文件功能
Sep 21 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代码
2010/08/08 PHP
三种php连接access数据库方法
2013/11/11 PHP
PHP获取用户访问IP地址的5种方法
2016/05/16 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
2018/06/04 PHP
IE innerHTML,outerHTML所引起的问题
2009/06/04 Javascript
一个简单的javascript类定义例子
2009/09/12 Javascript
下载站控制介绍字数显示的脚本 显示全部 隐藏介绍等功能
2009/09/19 Javascript
js获取TreeView控件选中节点的Text和Value值的方法
2012/11/24 Javascript
原生js ActiveXObject获取execl里面的值
2013/11/01 Javascript
轻松创建nodejs服务器(2):nodejs服务器的构成分析
2014/12/18 NodeJs
使用JavaScript和CSS实现文本隔行换色的方法
2015/11/04 Javascript
去除html代码里面的script正则方法
2016/05/19 Javascript
基于JavaScript实现飘落星星特效
2017/08/10 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
2018/02/01 Javascript
使用ng-packagr打包Angular的方法示例
2018/09/21 Javascript
浅析vue-router原理
2018/10/19 Javascript
JQuery模拟实现网页中自定义鼠标右键菜单功能
2018/11/14 jQuery
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
2019/11/01 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
2020/07/20 Javascript
[02:19]2018年度DOTA2最佳核心位选手-完美盛典
2018/12/17 DOTA
python解析xml文件操作实例
2014/10/05 Python
Python中的defaultdict模块和namedtuple模块的简单入门指南
2015/04/01 Python
一份python入门应该看的学习资料
2018/04/11 Python
浅谈flask源码之请求过程
2018/07/26 Python
python写程序统计词频的方法
2019/07/29 Python
Django使用unittest模块进行单元测试过程解析
2019/08/02 Python
在Python中os.fork()产生子进程的例子
2019/08/08 Python
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
中国网上药店领导者:1药网
2017/02/16 全球购物
Rosetta Stone官方网站:语言学习
2019/01/05 全球购物
Kickers鞋英国官网:男士、女士和儿童鞋
2021/03/08 全球购物
商务经理岗位职责
2014/08/03 职场文书
教师党员批评与自我批评发言稿
2014/10/15 职场文书
Python超简单容易上手的画图工具库推荐
2021/05/10 Python