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 相关文章推荐
动态生成gif格式的图像要注意?
Oct 09 PHP
谈谈PHP的输入输出流
Feb 14 PHP
介绍一些PHP判断变量的函数
Apr 24 PHP
ajax php传递和接收变量实现思路及代码
Dec 19 PHP
php图片的裁剪与缩放生成符合需求的缩略图
Jan 11 PHP
如何使用php绘制在图片上的正余弦曲线
Jun 08 PHP
php实现图形显示Ip地址的代码及注释
Jan 20 PHP
PHP创建word文档的方法(平台无关)
Mar 29 PHP
php实现当前页面点击下载文件的简单方法
Sep 22 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 PHP
php使用自带dom扩展进行元素匹配的原理解析
May 29 PHP
PHP执行普通shell命令流程解析
Aug 24 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去除数组中重复的元素并按键名排序函数
2008/08/18 PHP
兼容Mozilla必须知道的知识。
2007/01/09 Javascript
location.href语句与火狐不兼容的问题
2010/07/04 Javascript
JS实现日期加减的方法
2013/11/29 Javascript
使用GruntJS构建Web程序之合并压缩篇
2014/06/06 Javascript
javascript学习笔记(四)function函数部分
2014/09/30 Javascript
JavaScript设计模式之策略模式实例
2014/10/10 Javascript
JavaScript中的全局对象介绍
2015/01/01 Javascript
JavaScrip调试技巧之断点调试
2015/10/22 Javascript
JavaScript中两个字符串的匹配
2016/06/08 Javascript
用jmSlip编写移动端顶部日历选择控件
2016/10/24 Javascript
利用Node.js对文件进行重命名
2017/03/12 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
2017/03/14 Javascript
Node.js静态服务器的实现方法
2018/02/28 Javascript
如何更好的编写js async函数
2018/05/13 Javascript
json字符串传到前台input的方法
2018/08/06 Javascript
nodejs更新package.json中的dependencies依赖到最新版本的方法
2018/10/10 NodeJs
使用Node.js实现一个多人游戏服务器引擎
2019/03/13 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
2019/06/12 jQuery
vue利用全局导航守卫作登录后跳转到未登录前指定页面的实例代码
2020/05/19 Javascript
[02:39]DOTA2英雄基础教程 天怒法师
2013/11/29 DOTA
python3+PyQt5重新实现自定义数据拖放处理
2018/04/19 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
2018/12/12 Python
Django框架之DRF 基于mixins来封装的视图详解
2019/07/23 Python
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
迪卡侬比利时官网:Decathlon比利时
2019/12/28 全球购物
专营店会计助理岗位职责
2013/11/29 职场文书
公司中秋节活动方案
2014/02/12 职场文书
《太阳》教学反思
2014/02/21 职场文书
马云北大演讲完整版:真心话,什么才是阿里的核心竞争力?
2014/04/04 职场文书
3分钟英语演讲稿
2014/04/29 职场文书
电影小兵张嘎观后感
2015/06/03 职场文书
小鞋子观后感
2015/06/05 职场文书
OpenCV-Python实现人脸磨皮算法
2021/06/07 Python
python flappy bird小游戏分步实现流程
2022/02/15 Python
Python实现简单得递归下降Parser
2022/05/02 Python