当前位置:首页 > 日记 > 正文

PHP开发中解决并发问题的几种实现方法分析

PHP开发中解决并发问题的几种实现方法分析

本文实例讲述了PHP开发中解决并发问题的几种实现方法。分享给大家供大家参考,具体如下:

对于商品抢购等并发场景下,可能会出现超卖的现象,这时就需要解决并发所带来的这些问题了

在PHP语言中并没有原生的提供并发的解决方案,因此就需要借助其他方式来实现并发控制。

方案一:使用文件锁排它锁

flock函数用于获取文件的锁,这个锁同时只能被一个线程获取到,其它没有获取到锁的线程要么阻塞,要么获取失败

在获取到锁的时候,先查询库存,如果库存大于0,则进行下订单操作,减库存,然后释放锁

方案二:使用Mysql数据库提供的悲观锁

Innodb存储引擎支持行级锁,当某行数据被锁定时,其他进程不能对这行数据进行操作

先查询并锁定行:

select stock_num from table where id=1 for updateif(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+redis数据库程序设计技巧总结》、《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

相关文章

excel2013中怎么画柱状图

excel2013中怎么画柱状图

柱状图,方法,电脑软件,  excel常用于制图,提供多种图形,如折现图、饼状图、雷达图等等,下面小编就教你怎么在excel2013中画柱状图,希望看完本教程的朋友都能学会并运用起来。excel2013中画柱状图的方法打开要做柱状图的表格,点击鼠标左键全选,…

ps怎么绘制水彩晕染效果的图案?

ps怎么绘制水彩晕染效果的图案?

绘制,图案,效果,电脑软件,ps,ps中想要做一个漂亮的图案,该怎么制作呢?下面我们就来看看详细的教程。软件名称:Adobe Photoshop 8.0 中文完整绿色破解版软件大小:150.1MB更新时间:2015-11-041、首先打开Photoshop软件,并且熟悉一下PS里面的工具栏,…

excel扩展名是什么

excel扩展名是什么

后缀名,扩展名,什么呢,电脑软件,excel,excel从2007开始后缀名就开始了变化,很多人不知道excel的后缀名是什么,不知道后缀名是什么并不是什么丢人的事情,很多人还不知道什么是excel后缀名了,excel后缀名从office2007以后已经开始了改变,今天我们…

PS简单制作出有趣的破图效果

PS简单制作出有趣的破图效果

有趣,效果,简单,电脑软件,PS,前言:设计师在设计图片时,有时为了有趣和立体化,会采用破图的方法。破图说白了,就是通过颜色的严重反差,来造成一种立体的感觉。是不是只有大设计师才拥有这种手段呢,也未必。只有掌握了一定的方法,都可以做到的。首先…

mac系统下安装多个php并自由切换的

mac系统下安装多个php并自由切换的

方法,安装,系统,多个,详解,前言最近工作中遇到一个问题,需要实现在mac系统下安装多个php并实现自由切换,通过查找相关的资料找到了解决的方法,所以想着总结下来,方便大家和自己学习参考,下面话不多说,来看看的介绍吧。一、安装多版本php$ brew in…

win7打开任务管理器快捷键

win7打开任务管理器快捷键

快捷键,任务管理器,电脑软件,在我们使用的电脑中,对于进程管理器也叫作任务管理器,当然我们在关闭进程的时候也会经常会用到它。但是在Win7系统中,如果对系统不熟悉,那么也就不知道进程管理器在哪,不知道怎样打开。其实要打开Win7系统进程管理器…

微信小程序的生命周期的详解

微信小程序的生命周期的详解

生命周期,详解,程序,电脑软件,微信小,今天记录一下微信小程序的app生命周期及各页面的生命周期。(一)小程序的生命周期在app.json中进行监听,三个方法①onLauch方法只在小程序启动时触发一次。②onShow方法,在小程序启动时,及由后台切换至前台显…

Windows 7插入移动设备不能自动播

Windows 7插入移动设备不能自动播

移动设备,自动播放,电脑软件,Windows,当用户插入一个全新的USB移动设备时,在系统提示该设备可以正常使用后,没有出现“自动插放”窗口。这是由于Windows 7对未使用过的USB设备的默认操作识别,而不自动运行该问题的操作方法如下:1、右…

php求数组全排列,元素所有组合的方

php求数组全排列,元素所有组合的方

数组,全排列,组合,元素,方法,本文实例讲述了php求数组全排列,元素所有组合的方法。分享给大家供大家参考,具体如下:<?php$source = array('pll','我','爱','你','嘿');sort($source); //保证初始数组是有序的$last = count($source…

win7系统IIS 7.0以上版本配置PHP的

win7系统IIS 7.0以上版本配置PHP的

系统,方法,配置,版本,电脑软件,win7系统IIS 7.0以上版本配置PHP的方法微软和Zend合作以后,针对IIS推出了专门的FastCGI支持,在IIS下运行PHP,应该采用FastCGI方式来运行,而不是ISAPI方式。到了IIS7.0以后的版本,微软更进一步,将FastCGI内置到IIS中…

excel中出现 #value! 解决办法

excel中出现 #value! 解决办法

解决办法,电脑软件,excel,在excel中,出现#value一般是公式中的错误参数所致,具体的说主要包含以下三个方面:1、运算的时候使用了非数值的单元格上图中,大家可以看到a1的是数值,而a3是字符,所以,当a1+a3的时候就会出现 #value!的错误,因为当字符和数…

利用PHP访问带有密码的Redis方法示

利用PHP访问带有密码的Redis方法示

方法,密码,示例,电脑软件,PHP,一、首先设置Redis密码,以提供远程登陆打开redis.conf配置文件,找到requirepass,然后修改如下:requirepass yourpasswordyourpassword就是redis验证密码,设置密码以后发现可以登陆,但是无法执行命令了。命令如下:re…