php 怎么模拟高并发,windows下jmeter+php模拟高并发

1、环境:windows+nginx+mysql5.7+php7.1

2、测试接口:

//重置库存

public function createNum(){

$num = 500;//100库存

$sku_id = 1;

Redis::del('sku_store:'.$sku_id);

for($i=0;$i

Redis::rPush('sku_store:'.$sku_id,1);

}

return $this->returnSuccess([],200000,'设置成功');

}

//并发接口:

public function activeOrder(Request $request){

$sku_id = 1;

$storeKey = 'sku_store:';

$currentKey = 'current_user:';

$successKey = 'success_user:';

$requestKey = 'request_user:';

$requestUsers = Cache::get($requestKey.$sku_id);

try{

$user_id = rand(1,100);

if(empty($requestUsers)){

$requestUsers = [];

}

$requestUsers[] = $user_id;

Cache::forever($requestKey.$sku_id, $requestUsers);

$sku_store = Redis::lLen($storeKey.$sku_id);//当前sku库存

$result = Redis::hSet($currentKey.$sku_id,$user_id,$user_id);

if($result){

//首次抢购

if($sku_store<=0){

return $this->returnError('已经抢光了!');

}else{

$result = Redis::hSet($successKey.$sku_id, $user_id, $user_id);//记录实际抢到商品的用户

Redis::lPop($storeKey.$sku_id);

return $this->returnSuccess(['user_id'=>$user_id],200000,'抢购成功');

}

}else{

return $this->returnError('您已经抢过了!');

}

}catch(\Exception $e){

Log::info($e->getMessage());

return $this->returnError('抢购人数过多,请重试');

}

}

3、jmeter部署

1)、添加线程组 右键测试计划添加-线程(用户)-线程组

2)、添加http请求 右键线程组添加-取样器-HTTP请求

3)、添加察看结果树 右键http请求-监听器-察看结果树

4)、添加聚合报告 右键http请求-监听器-聚合报告

5)、配置http请求

1ed15926066e4f77272804b34b906de1.png

6)、配置线程,100并发,循环执行5次,然后启动执行

859dc3c001c3e7aa101ff1f43ffa4384.png

1、问题:当执行超过60次的时候,执行失败报错:

{"message":"Too Many Attempts.","status_code":429

我用的是laravel框架,默认同一秒最多请求数为60,可以在app - Http - Kernel.php修改

587ca4d9533aa6dc2717f12b6c2638b4.png

修改后100并发模拟成功,样本数是500个

e4eec57472592b5a0e11e0b0fef69e1c.png

2、改为200并发模拟测试,运行一段时间后ngnix报错:

WSARecv() failed (10054: An existing connection was forcibly closed by the remote host) while reading response header from upstream

原因是nginx+fastcgi+php并发阻塞引起的。

解决方案:ngnix的负载均衡处理,打开ngnix.conf文件,在http下新增

upstream phpfastcgi_proxy {

server 127.0.0.1:9000;

server 127.0.0.1:9001;

server 127.0.0.1:9002;

server 127.0.0.1:9003;

}

修改:

location ~ \.php(.*)$  {

#fastcgi_pass   127.0.0.1:9000;

fastcgi_pass  phpfastcgi_proxy;

fastcgi_index  index.php;

fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;

fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

fastcgi_param  PATH_INFO  $fastcgi_path_info;

fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;

include        fastcgi_params;

}

同时在cmd启动进程,在PHP安装目录下执行命令:php-cgi.exe -b 127.0.0.1:9001 -c php.ini

其他类似,同时打开3个cmd窗口。然后重新测试200并发,发现执行速度变快了,且没有异常。

3、改成500并发测试,ngnix报错:

maximum number of descriptors supported by select() is 1024 while connecting to upstream

这个问题在网上查询的话重新下载windows版的ngnix,这个我没有测试,不知道可行不可行。

参考文档:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值