ab -n1000 -c10 http://127.0.0.1:9501/skill
application-Index.php
/** * 經過swoole的chan和協程處理秒殺 * 思路 * 設置一個通道channel數量爲1,一個協程向裏面寫入用戶的數據好比是用戶的ID * 另外一個協程來處理通道的數據寫入beanstalkd或者Redis中的隊列 * 此例子我選用寫入Redis的list,由於我本機沒安裝beanstalkd */ public function skill() { $chan = new channel(1); $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); $res = []; //生成者協程 co::create(function () use ($chan, $redis, &$res) { //查看chan中的數量 $num = $chan->length(); //當數量等於0而且庫存還有的狀況下的時候表名,通道爲空能夠寫入數據 // stock庫存須要提早設置到Redis if ($num == 0 && $redis->get('stock')) { $chan->push(['id' => rand(100, 999)]); } $res = [0, "搶購失敗"]; }); //消費者協程 co::create(function () use ($chan, $redis, &$res) { $data = $chan->pop(); if ($data) { //此處默認每一個人搶購1件,若是須要搶購多件能夠在data中攜帶購買數量 //並寫入到通道里面 $redis->set('stock', $redis->get('stock') - 1); //寫入Redis list 其餘腳本進行訂單處理之類的IO業務。此處不實現了 $redis->lPush("skill_swoole", json_encode($data)); $res = [1, "搶購成功"]; } }); return Tool::print_json($res[0], $res[1]); }
https://github.com/SmallForest/Thomas.kj
這是本人本身寫的框架,CLI模式,常駐內存性能高,感興趣的能夠提提建議,幫助一塊兒優化。感謝starphp
秒殺實現方式較多,選擇適合本身的最好git