关于swoole:基于PHP-swoole扩展的秒杀思路

34次阅读

共计 1029 个字符,预计需要花费 3 分钟才能阅读完成。

基于 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

秒杀

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

正文完
 0