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数据库代码
Mar 10 PHP
PHP开发的一些注意点总结
Oct 12 PHP
php中通过curl smtp发送邮件
Jun 05 PHP
PHP CLI模式下的多进程应用分析
Jun 03 PHP
使用PHP备份MYSQL数据的多种方法
Jan 15 PHP
浅谈php冒泡排序
Dec 30 PHP
php实现cookie加密的方法
Mar 10 PHP
php微信支付接口开发程序
Aug 02 PHP
详谈PHP面向对象中常用的关键字和魔术方法
Feb 04 PHP
php实现简单加入购物车功能
Mar 07 PHP
PHP实现的回溯算法示例
Aug 15 PHP
PHP与SQL语句写一句话木马总结
Oct 11 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
星际争霸 Starcraft 编年史
2020/03/14 星际争霸
php中常用字符串处理代码片段整理
2011/11/07 PHP
第五章 php数组操作
2011/12/30 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
2012/04/19 PHP
PHP实现过滤掉非汉字字符只保留中文字符
2015/06/04 PHP
PHP实现数据库的增删查改功能及完整代码
2018/04/18 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
js解析与序列化json数据(二)序列化探讨
2013/02/01 Javascript
jquery实现的一个简单进度条效果实例
2014/05/12 Javascript
js控制页面的全屏展示和退出全屏显示的方法
2015/03/10 Javascript
jquery实现Ctrl+Enter提交表单的方法
2015/07/21 Javascript
BootStrap智能表单实战系列(七)验证的支持
2016/06/13 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
详解Vue前端生产环境发布配置实战篇
2019/05/07 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
Vue项目打包部署到iis服务器的配置方法
2019/10/14 Javascript
如何在wxml中直接写js代码(wxs)
2019/11/14 Javascript
使用Python获取CPU、内存和硬盘等windowns系统信息的2个例子
2014/04/15 Python
python中二维阵列的变换实例
2014/10/09 Python
python通过ssh-powershell监控windows的方法
2015/06/02 Python
详解python中的文件与目录操作
2017/07/11 Python
Python实现基于二叉树存储结构的堆排序算法示例
2017/12/08 Python
win8.1安装Python 2.7版环境图文详解
2019/07/01 Python
意大利综合购物网站:Giordano Shop
2016/10/21 全球购物
高等教育学自荐书范文
2014/02/10 职场文书
2014年国培研修感言
2014/03/09 职场文书
寄语学生的话
2014/04/10 职场文书
美丽家庭事迹材料
2014/05/03 职场文书
新书发布会策划方案
2014/06/09 职场文书
岗位工作说明书
2014/07/29 职场文书
检讨书格式
2015/01/23 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
详解Nginx 被动检查服务器的存活状态
2021/10/16 Servers
十大最强岩石系宝可梦,怪颚龙实力最强,第七破坏力很强
2022/03/18 日漫