封装curl_multi让请求与业务逻辑并行执行

这个范例将会创建2个cURL句柄,把它们加到批处理句柄,然后并行地运行它们。

<?php
// 创建一对cURL资源
$ch1 = curl_init();
$ch2 = curl_init();

// 设置URL和相应的选项
curl_setopt($ch1, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);

// 创建批处理cURL句柄
$mh = curl_multi_init();

// 增加2个句柄
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

$running=null;
// 执行批处理句柄
do {
    usleep(10000);
    curl_multi_exec($mh,$running);
} while ($running > 0);

// 关闭全部句柄
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

?>

封装curl_multi让请求与业务逻辑并行执行

前言
  • curl_multi 创建一个批处理,将多个 curl 句柄加入其中,然后执行这个批处理
  • curl_multi_exec() 执行批处理中需要操作的句柄。
    • 发送请求 / 接收处理响应,等待响应时则无需操作
  • curl_multi_select() 阻塞等待,直到有待处理的句柄 / 超时
    • 如某个句柄接收到了响应。
    • 此函数可以避免等待期的死循环空转 exec 情况。线程应该是挂起状态,由底层触发唤醒。
分析
  • 优化核心在于 curl_multi_exec() 和 curl_multi_select()
  • 通过调试发现执行 curl_multi_exec() 第一次即为发送 HTTP 请求报文,推测 exec 的执行粒度为 HTTP 请求 / 响应报文的处理。
  • 所以我们可以先发送请求,然后执行自己的业务逻辑,最后需要时再获取执行结果。这样就可以复用等待响应的时间。
  • 因为重定向 /HTTPS 都会涉及到多次 HTTP报文交互,封装中尽量为其提供了可选优化参数。

代码仓库 gitee.com/VwenX/curl-mut

文章来源:https://learnku.com/articles/52901

暂无评论

发送评论 编辑评论


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