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请求
6)、配置线程,100并发,循环执行5次,然后启动执行
1、问题:当执行超过60次的时候,执行失败报错:
{"message":"Too Many Attempts.","status_code":429
我用的是laravel框架,默认同一秒最多请求数为60,可以在app - Http - Kernel.php修改
修改后100并发模拟成功,样本数是500个
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,这个我没有测试,不知道可行不可行。
参考文档: