百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>网页制作> PHP之curl_multi并发详解办法
分享文章到:

PHP之curl_multi并发详解办法

发布时间:09/01 来源:未知 浏览: 关键词:

PHP中curl_multi并发详解

PHP中的curl_multi系列函数可以实现同时恳求多个URL来实现并发,而不是像一般curl函数那样恳求后会堵塞,直到结果返回才停止下一个恳求。因此在大量恳求URL时可通过curl_multi系列函数晋升程序的运转效力。

curl一般恳求

$startTime = microtime(true);
$chArr = [];
$optArr = [
    CURLOPT_URL => 'http://www.httpbin.org/ip',
    CURLOPT_HEADER => 0,
    CURLOPT_RETURNTRANSFER => 1,
];
$result = [];
//创立多个curl资源并施行
for ($i=0; $i<10; $i++) {
    $chArr[$i] = curl_init();
    curl_setopt_array($chArr[$i], $optArr);
    $result[$i] = curl_exec($chArr[$i]);
    curl_close($chArr[$i]);
}
$endTime = microtime(true);
echo sprintf("use time: %.3f s".PHP_EOL, $endTime - $startTime);use time: 6.080 s

use time: 6.080 s

curl_multi并发恳求

$startTime = microtime(true);
$chArr = [];
$optArr = [
    CURLOPT_URL => 'http://www.httpbin.org/ip',
    CURLOPT_HEADER => 0,
    CURLOPT_RETURNTRANSFER => 1,
];
$result = [];
//创立多个curl资源
for ($i=0; $i<10; $i++) {
    $chArr[$i] = curl_init();
    curl_setopt_array($chArr[$i], $optArr);
}
//创立批处置curl句柄
$mh = curl_multi_init();
//将单个curl句柄增加到批处置curl句柄中
foreach ($chArr as $ch) {
    curl_multi_add_handle($mh, $ch);
}
//推断操纵可否仍在施行的标识的援用
$active = null;
/**
 * 本次轮回第一次处置 $mh 批处置中的 $ch 句柄,并将 $mh 批处置的施行状态写入 $active,
 * 当状态值等于 CURLM_CALL_MULTI_PERFORM 时,表白数据还在写入或读取中,施行轮回,
 * 当第一次 $ch 句柄的数据写入或读取成功后,状态值变为 CURLM_OK ,跳出本次轮回,进入下面的大轮回中。
 */
do {
    //处置在批处置栈中的每一个句柄
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
/**
 * 上面这段代码中,是可以直接使用 $active > 0 来作为 while 的前提,如下:
 * do {
 *   $mrc = curl_multi_exec($mh, $active);
 * } while ($active > 0);
 * 此时假如整个批处置句柄没有全部施行完毕时,系统会不断的施行 curl_multi_exec 函数,从而致使系统CPU占用会很高,
 * 因此一样不采纳这种方案,可以通过 curl_multi_select 函数来到达没有需要读取的程序就堵塞住的目的。
 */
/**
 * $active 为 true 时,即 $mh 批处置之中还有 $ch 句柄等候处置,
 * $mrc == CURLM_OK,即上一次 $ch 句柄的读取或写入已经施行完毕。
 */
while ($active && $mrc == CURLM_OK) {
    /** 
     * 程序进入堵塞状态,直到批处置中有活动连接(即 $mh 批处置中还有可施行的 $ch 句柄),
     * 这样施行的好处是 $mh 批处置中的 $ch 句柄会在读取或写入数据完毕后($mrc == CURLM_OK)进入堵塞阶段,
     * 而不会在整个 $mh 批处置施行时不断地施行 curl_multi_exec 函数,白白白费CPU资源。
     */
     if (curl_multi_select($mh) != -1) {
        //程序退出堵塞状态连续施行需要处置的 $ch 句柄
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}
foreach ($chArr as $i=>$ch) {
    //猎取某个curl句柄的返回值
    $result[$i] = curl_multi_getcontent($ch);
    //移除批处置句柄中的某个句柄资源
    curl_multi_remove_handle($mh, $ch);
}
//关闭一组curl句柄
curl_multi_close($mh);
$endTime = microtime(true);
echo sprintf("use time: %.3f s".PHP_EOL, $endTime - $startTime);

use time: 0.599 s

通过对照上述程序的运转时间可以得知,使用curl_multi系列函数并发恳求要比一般的curl函数顺次恳求效力高许多。

引荐教程:《PHP视频教程》

以上就是PHP之curl_multi并发详解办法的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有150人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板