Maison > cadre php > PensezPHP > 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

藏色散人
Libérer: 2021-02-08 16:15:15
avant
3375 Les gens l'ont consulté

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;
            }
        }
Copier après la connexion

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;;
     }
Copier après la connexion

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;;
         }
Copier après la connexion

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
Copier après la connexion

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!

Étiquettes associées:
source:oschina.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal