php并发方法有哪些-PHP问题

资源魔 37 0

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使用问题

抱歉,评论功能暂时关闭!