ThinkCMF API发起异步请求,不等待请求返回

主要用于上报非关键数据,比如用户行为日志,访问日志等操作。如果不用异步操作,可能会因为写入日志时阻塞。(服务原因/网络原因等)

先写一个接口,使用sleep函数延迟返回,然后用异步请求测试一下效果如何。

测试接口(模拟请求返回时延迟长的场景

public function test()
{
    $t1=microtime();
    sleep(3);
    $t2=microtime();
    $data['请求开始时间']=$t1;
    $data['请求结束时间']=$t2;
    $this->success(200,"访问成功",$data);
}

返回消息

{
	"code": 200,
	"msg": "访问成功",
	"count": 0,
	"data": {
		"请求开始时间": "0.03911800 1576858719",
		"请求结束时间": "0.03919800 1576858722"
	}
}

 

发起异步请求

public function test2()
{
    $t1=microtime();

    $params=$this->request->param();
    $url="测试接口的URL";

    $args = parse_url($url); //对url做下简单处理
    $host = $args['host']; //获取上报域名
    $path = $args['path'] . '?' . http_build_query($params);//获取上报地址

    $fp = fsockopen($host, 80, $error_code, $error_msg, 1);
    if (!$fp) {
        $this->error($error_code,$error_msg);
    } else {
        stream_set_blocking($fp, true);//开启了手册上说的非阻塞模式
        stream_set_timeout($fp, 1);//设置超时
        $header = "GET $path HTTP/1.1\r\n";  //注意 GET/POST请求都行 我们需要自己按照要求拼装Header http协议遵循1.1
        $header .= "Host: $host\r\n";
        $header .= "Connection: close\r\n\r\n";//长连接关闭
        fwrite($fp, $header);
        fclose($fp);
    }
    $t2=microtime();
    $data['请求开始时间']=$t1;
    $data['请求结束时间']=$t2;
    $this->success(200,"异步请求",$data);
}

返回

{
	"code": 200,
	"msg": "异步请求",
	"count": 0,
	"data": {
		"请求开始时间": "0.10074000 1576859072",
		"请求结束时间": "0.16182900 1576859072"
	}
}

 

可以通过开始和结束时间明显看到,通过 fsockopen 函数已经实现了异步的网络请求。

 

 

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇