Maison  >  Article  >  cadre php  >  Comparez l'efficacité de ThinkPHP5 et du code sans framework dans des conditions de concurrence élevée

Comparez l'efficacité de ThinkPHP5 et du code sans framework dans des conditions de concurrence élevée

藏色散人
藏色散人avant
2021-02-08 16:15:153233parcourir

La colonne tutorielle suivante de thinkphp vous présentera la comparaison de l'efficacité de ThinkPHP5 et du code sans cadre sous une concurrence élevée. J'espère qu'elle sera utile aux amis dans le besoin !

Comparez l'efficacité de ThinkPHP5 et du code sans framework dans des conditions de concurrence élevée

Logique métier testée : testez une fonction de loterie et utilisez le mécanisme de verrouillage optimiste de la base de données MySQL pour éviter les émissions excessives.

Code clé :

$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][&#39;randnum&#39;]) {
                $level = $prizeArr[$i][&#39;level&#39;];
                break;
            }
        }

Aucun code de framework :

$sql = "select * from `lottory` where id=".$level." ";
     $res = $rnpdo->RnFetchRow($sql, array());
     $dataNum = $res[&#39;errmsg&#39;][&#39;prizenum&#39;];    //剩余数量
     $version = $res[&#39;errmsg&#39;][&#39;version&#39;];    //版本号
     
     $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[&#39;errmsg&#39;])) {
         //插入抽奖记录
         $openid = $version.&#39;-&#39;.createOpenid();
         $time = time();
         $insertSql = "insert into `lottory_list` ( `openid`, `prize`, `posttime`) values (&#39;$openid&#39;,&#39;$level&#39;,&#39;$time&#39;) ";
         $rnpdo->RnPtmQuery($insertSql, array());
         
         echo &#39;success&#39;;
     }
     else
     {
         echo &#39;fail&#39;;
     }

Utilisez la partie du code thinkPHP5 :

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

Utilisez ab pour tester les performances sous haute concurrence :

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

Testé sur le même serveur, le serveur web utilise nginx, dans lequel TP5 annule l'écriture du log (il n'a pas été supprimé la première fois, le QPS était inférieur).

Les données clés :

QPS sans cadre : requêtes par seconde : 972,21 [#/sec] (moyenne)

thinkPHP5 : requêtes par seconde : 206,92 [#/sec ] (moyenne)

La même logique métier sans framework est 4,7 fois celle de tp5.

Je ne sais pas s'il y a des domaines dans lesquels TP5 n'a pas été optimisé. Aucun des deux codes de page n'utilise la mise en cache.

Avez-vous une compréhension approfondie du tp5 et pouvez-vous fournir quelques conseils ? Y a-t-il d'autres domaines qui doivent être optimisés ?


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer