基于PHP swoole扩大的秒杀思路

通过ab压力测试,脚本QPS平均值在4500

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模式,常驻内存性能高,感兴趣的能够提提倡议,帮忙一起优化。感激star

秒杀

秒杀实现形式较多,抉择适宜本人的最好