• 技术文章 >php框架 >ThinkPHP

    比较ThinkPHP5和无框架代码在高并发下的效率

    藏色散人藏色散人2021-02-08 16:15:15转载766
    下面由thinkphp教程栏目给大家介绍比较ThinkPHP5和无框架代码在高并发下的效率,希望对需要的朋友有所帮助!

    测试的业务逻辑:测试一个抽奖功能,使用MySQL数据库的乐观锁机制防止超发。

    关键代码:

    $prizeArr = array(
                array('level' => 1, 'name' => '手机', 'randnum' => 10),
                array('level' => 2, 'name' => '100元话费', 'randnum' => 5010),
                array('level' => 3, 'name' => '自拍杆', 'randnum' => 15010),
                array('level' => 4, 'name' => '5元红包', 'randnum' => 115010),
            );
    
            $rand_num = mt_rand(1, 115010);
            $level = 4;
            
            for ($i = 0; $i < 4; $i++) {
                if ($rand_num <= $prizeArr[$i]['randnum']) {
                    $level = $prizeArr[$i]['level'];
                    break;
                }
            }

    不用框架代码:

    $sql = "select * from `lottory` where id=".$level." ";
         $res = $rnpdo->RnFetchRow($sql, array());
         $dataNum = $res['errmsg']['prizenum'];    //剩余数量
         $version = $res['errmsg']['version'];    //版本号
         
         $updatesql = "update `lottory` set prizenum=prizenum-1,version=version+1 where id=".$level." and version=".$version." ";
         $updateres = $rnpdo->RnExec($updatesql, array());
         //print_r($res);
         if(!empty($updateres['errmsg'])) {
             //插入抽奖记录
             $openid = $version.'-'.createOpenid();
             $time = time();
             $insertSql = "insert into `lottory_list` ( `openid`, `prize`, `posttime`) values ('$openid','$level','$time') ";
             $rnpdo->RnPtmQuery($insertSql, array());
             
             echo 'success';
         }
         else
         {
             echo 'fail';
         }

    使用thinkPHP5代码部分:

    $res = Db::table("lottory")->where('id',$level)->find();
             
             $dataNum = $res['prizenum'];    //剩余数量
             $version = $res['version'];    //版本号
             dump($res);
             
             $result = Db::table('lottory')->where('id', $level)->where('version', $version)->update(['prizenum' => ['exp','prizenum-1'],'version' => ['exp','version+1']]);
             dump($result);
             if($result) {
                 //插入抽奖记录
                 $openid = $version.'-'.createOpenid();
                 $time = time();
                 $data = ['openid' => $openid, 'prize' => $level,'posttime'=>$time];
                 Db::table('lottory_list')->insert($data);
                 
                 echo 'success';
             }
             else
             {
                 echo 'fail';
             }

    使用ab测试高并发下的表现:

    ab -c 1000 -n 10000 http://localhost/lottory.php
    ab -c 1000 -n 10000 http://localhost/index.php?s=index/index/hello

    测试在同一服务器上,web服务器使用nginx,其中TP5取消了日志写入(第一次没有去掉,QPS更低)。

    其中关键数据:

    无框架QPS:Requests per second: 972.21 [#/sec] (mean)

    thinkPHP5:Requests per second: 206.92 [#/sec] (mean)

    同样的业务逻辑,无框架是tp5的4.7倍。

    不知道TP5是不是还有什么地方没有优化,两个页面代码均没有使用缓存。

    各位大神有对tp5了解深的指导一下,是否还有其它地方要优化?

    以上就是比较ThinkPHP5和无框架代码在高并发下的效率的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:oschina,如有侵犯,请联系admin@php.cn删除
    专题推荐:对比
    上一篇:解析thinkphp withCredentials跨域问题解决思路 下一篇:详解thinkphp5.1/5.0定时任务的实现步骤
    大前端线上培训班

    相关文章推荐

    • thinkphp5.1和php、vue.js实现前后端分离和交互• Thinkphp5如何使用validate实现验证功能• 解决thinkphp5.1上传宝塔服务器报错问题• 详解thinkphp5.1的URL重写,伪静态设置• 解析ThinkPHP5.1自定义标签的使用

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网