下面由thinkphp教程欄目給大家介紹比較thinkphp5和無框架代碼在高并發(fā)下的效率,希望對需要的朋友有所幫助!
測試的業(yè)務(wù)邏輯:測試一個抽獎功能,使用MySQL數(shù)據(jù)庫的樂觀鎖機(jī)制防止超發(fā)。
關(guān)鍵代碼:
$prizeArr?=?array( ????????????array('level'?=>?1,?'name'?=>?'手機(jī)',?'randnum'?=>?10), ????????????array('level'?=>?2,?'name'?=>?'100元話費(fèi)',?'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?<p>不用框架代碼:</p><pre class="brush:php;toolbar:false">$sql?=?"select?*?from?`lottory`?where?id=".$level."?"; ?????$res?=?$rnpdo->RnFetchRow($sql,?array()); ?????$dataNum?=?$res['errmsg']['prizenum'];????//剩余數(shù)量 ?????$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代碼部分:
立即學(xué)習(xí)“PHP免費(fèi)學(xué)習(xí)筆記(深入)”;
$res?=?Db::table("lottory")->where('id',$level)->find(); ????????? ?????????$dataNum?=?$res['prizenum'];????//剩余數(shù)量 ?????????$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測試高并發(fā)下的表現(xiàn):
ab?-c?1000?-n?10000?http://localhost/lottory.php ab?-c?1000?-n?10000?http://localhost/index.php?s=index/index/hello
測試在同一服務(wù)器上,web服務(wù)器使用nginx,其中TP5取消了日志寫入(第一次沒有去掉,QPS更低)。
其中關(guān)鍵數(shù)據(jù):
無框架QPS:Requests per second: ? 972.21 [#/sec] (mean)
thinkPHP5:Requests per second: ? ?206.92 [#/sec] (mean)
同樣的業(yè)務(wù)邏輯,無框架是tp5的4.7倍。
不知道TP5是不是還有什么地方?jīng)]有優(yōu)化,兩個頁面代碼均沒有使用緩存。
各位大神有對tp5了解深的指導(dǎo)一下,是否還有其它地方要優(yōu)化?
? 版權(quán)聲明
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載。
THE END