您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
hyperf框架实现携程并发请求,支持防对方宕机机制(请求分组)
发布时间:2022-09-26 20:40:56编辑:雪饮阅读()
原生不分组情况下,我们需要批量,比如一般都是抓取别人的数据
<?php
//原生100个请求运行于nginx等,耗时4秒左右
$get_result_list=[];
for($i=0;$i<100;$i++){
$response["url"]="https://www.baidu.com/?i=".$i;
$response["response"]=file_get_contents("https://www.baidu.com/?i=".$i);
$get_result_list[]=$response;
}
echo json_encode($get_result_list);
像是这样,耗时比较久。
那么用hyperf也是如此的思路来实现:
//hyperf框架自身100个请求耗时3秒左右
public function index()
{
$get_result_list=[];
for($i=0;$i<100;$i++){
$response["url"]="https://www.baidu.com/?i=".$i;
$response["response"]=file_get_contents("https://www.baidu.com/?i=".$i);
$get_result_list[]=$response;
}
return $get_result_list;
}
这样原理差不多,但是耗时就少了一秒,可能只是偶然,或许下次测试又是4秒多了
那么使用hyper携程不分组(所有请求一起并发,可能会导致对方服务器宕机)来实现:
//框架携程不分组100个请求177毫秒
public function index2(){
$parallel = new Parallel(100);
for ($i = 0; $i < 100; $i++) {
$parallel->add(function () use($i){
$response["url"]="https://www.baidu.com/?i=".$i;
$response["response"]=file_get_contents("https://www.baidu.com/?i=".$i);
return $response;
});
}
try{
$results = $parallel->wait();
return $results;
} catch(ParallelExecutionException $e){
// $e->getResults() 获取协程中的返回值。
// $e->getThrowables() 获取协程中出现的异常。
}
}
可以看到耗时就比较少了。
为了防止对方宕机,则一般是要对请求分组的,如:
//框架携程分组100个请求187毫秒
public function index3(){
$parallel = new Parallel(25);
for ($i = 0; $i < 100; $i++) {
$parallel->add(function () use($i){
$response["url"]="https://www.baidu.com/?i=".$i;
$response["response"]=file_get_contents("https://www.baidu.com/?i=".$i);
return $response;
});
}
try{
$results = $parallel->wait();
return $results;
} catch(ParallelExecutionException $e){
}
}
实际上上面请求不分组的携程实例,不应该用Parallel,这个为了分组的,上面把分组大小设置的和请求数一样就模拟成了不分组而已。实际上不分组的写法在hyperf上面有介绍的,根据自己的理解,你可以写的更好点,我这里忘了那个语法,比较只是看了没有几眼。
关键字词:hyperf,携程,防宕机