malike 发表于 2018-2-11 11:45:59


            本文以抢购、秒杀为例。介绍如何在高并发状况下确保数据正确。
在高并发请求下容易参数两个问题
1.数据出错,导致产品超卖。
2.频繁操作数据库,导致性能下降。
测试环境
Windows7
apache2.4.9
php5.5.12
php框架 yii2.0
工具 apache bench (apache自带高并发请求工具)。
通常处理方法
从控制器可以看出代码思路。先查询商品库存。如果库存大于0 ,则库存减少1,同时生产订单,录入抢购者数据。
// 常规代码处理高并发
public function actionNormal(){
    // 查询库存
    $stock = Goods::find()->select('stock')->where(['goods_id'=>100001])->asArray()->one();
    // 判断该商品是否还有库存
    if ($stock['stock']>0) {
      // 库存减一
      Goods::updateAllCounters(['stock' => -1],['goods_id'=>100001]);
      // 生产订单(另外功能,暂且随机赋值)
      $order = $this->build_order();
      // 秒杀信息入库
      $model = new Highly();
      $model->order_id = $order;
      $model->goods_name = '秒杀商品';
      $model->buy_time = date('Y-m-d H:i:s',time());
      $model->mircrotime = microtime(true);
      if($model->save()===false){
      echo '未能成功抢购!';
      }else{
      echo '恭喜你,订单'.$order.'抢购成功';
      }
    }else{
      echo '已被抢购一空!';
    }
}
页: [1]
查看完整版本: php处理抢购类功能的高并发请求