当前位置: 首页 > 后端技术 > PHP

基于PHPswoole扩展的秒杀思路

时间:2023-03-29 21:44:10 PHP

基于PHPswoole扩展的秒杀思路已经通过ab压力测试,平均脚本QPS为4500ab-n1000-c10http://127.0.0.1:9501/skill脚本代码,思路基本相同在代码注释application-Index.php/***通过swoole的chan和协程处理秒杀*思路*设置通道数为1,一个协程写入用户的数据写入其中,比如用户的ID*另一个协程来处理写入beanstalkd或Redis中的队列的通道数据*在这个例子中,我选择在Re??dis中写入列表,因为我的机器上没有安装beanstalkd*/publicfunctionskill(){$chan=新频道(1);$redis=new\Redis();$redis->connect('127.0.0.1',6379);$res=[];//生成器协程co::create(function()use($chan,$redis,&$res){//检查chan中的数量$num=$chan->length();//当数量相等时为0且还有库存,表名,通道为空数据可以写入//库存库存需要提前设置到Redisif($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列表,其他订单处理等IO服务的脚本这里没有实现$redis->lPush("skill_swoole",json_encode($data));$res=[1,"购买成功"];}});返回工具::print_json($res[0],$res[1]);}代码仓库https://github.com/SmallForest/Thomas.kj这是我自己写的框架,CLI方式,常驻内存性能高。有兴趣的可以提出建议,一起帮忙优化。感谢star,实现秒杀的方式有很多种,选择最适合自己的