浅析php curl_multi_*系列函数进行批量http请求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅析php curl_multi_*系列函数进行批量http请求相关的知识,希望对你有一定的参考价值。

何起:

  一系列 数量很大 数据不热 还希望被蜘蛛大量抓取的页面,在蜘蛛抓取高峰时,响应时间会被拉得很高。

  前人做了这样一个事儿:页面分3块,用3个内部接口提供,入口文件用curl_multi_*系列函数抓取3个内部接口的内容,拼成一个页面。

  怀疑这样做会有影响性能的可能。

 

  故学而分析之。

 

看了php官方手册,总结批量调用过程如下:

  curl_multi_init — 返回一个新cURL批处理句柄,作为curl_init生成的单个curl句柄的容器

  curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄。

  curl_multi_exec — 运行当前 cURL 句柄的子连接

  curl_multi_getcontent — 如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流

  curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源

  curl_multi_close — 关闭一组cURL句柄

摘一段php官网的示例代码:  

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

// 设置URL和相应的选项
curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");
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);

$active = null;
// 执行批处理句柄
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

// 读取数据
$content1 = curl_multi_getcontent($ch1);
$content2 = curl_multi_getcontent($ch2);
// 关闭全部句柄
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

?>

 

笔者有疑惑,大概弄明白了的点:

    

以上是关于浅析php curl_multi_*系列函数进行批量http请求的主要内容,如果未能解决你的问题,请参考以下文章

PHP中curl_multi并发详解

markdown PHP:curl_multi

浅析laravel路由执行原理

Spark的竞争者——Flink浅析

浅析php过滤html字符串,防止SQL注入的方法

浅析PHP7新功能及语法变化总结