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教程 并发 php故障解决 php使用问题
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
抱歉,评论功能暂时关闭!