何起:

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

  前人做了这样一个事儿:页面分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_select()的值

    curl_multi_select — 等待所有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);?>

疑惑和思考:

  1.批量请求的原理

    php没有多线程,借助操作系统的多线程来实现(网上看到的)

  2.批量请求以操作系统的多线程机制为基础,理论上会大量消耗机器的cpu

    a.开发机上验证,大批量请求时,cpu调用确实会急剧升高

    b.对比 线上前端机的负载情况 和 页面响应时间拉长 的时间点,发现线上前端机负载并无明显升高(维持在0.3左右)

    c.网上看到有人在curl_multi_select()返回值不是-1的时候(表示有请求没有处理完成)usleep(100),休眠以避免不对读处理状态而造成的不必要cpu压力。

  notice:

    2中的a、b有所矛盾,暂未找到根本原因

    2中的c没有经过实践测试

欢迎阅者批评指正

笔者:一般的小帅

  

转载于:https://www.cnblogs.com/newbalanceteam/p/5292852.html

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

  1. 浅析 JavaScript 中的 函数 uncurrying 反柯里化

    柯里化 柯里化又称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果. 因此柯里化的过程是 ...

  2. windows线程同步-原子操作-Interlocked系列函数(用户模式)

    Interlocked系列函数用来保证原子访问. InterlockedExchangeAdd提供保证long类型的原子操作. InterlockedExchangeAdd64提供long long ...

  3. Lync Server 2010的部署系列(三) lync批量导入用户联系人

    Lync Server 2010的部署系列(三) lync批量导入用户联系人 一.批量导入原理介绍 二.导入联系人操作指南 一.批量导入原理介绍 (介绍摘自http://ucworld.blog.51 ...

  4. 线程模型、pthread 系列函数 和 简单多线程服务器端程序

    一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属于1:1模型. (一).N:1用户线程模型 "线程实现"建立在&qu ...

  5. UNIX再学习 -- exit 和 wait 系列函数

    我们一开始讲进程环境时,就有提到了.进程有 8 种方式使进程终止. 其中 5 种为正常终止,它们是: (1)在 main 函数中执行 return (2)调用 exit 函数,并不处理文件描述符,多进 ...

  6. 《Windows核心编程》---Interlocked原子访问系列函数

    所谓原子访问,指的是一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源.Interlocked系列函数提供了这样的操作.所有这些函数会以原子方式来操控一个值. Interlock ...

  7. 秒杀多线程第三篇 原子操作 Interlocked系列函数

    上一篇<多线程第一次亲密接触 CreateThread与_beginthreadex本质区别>中讲到一个多线程报数功能.为了描述方便和代码简洁起见,我们可以只输出最后的报数结果来观察程序是 ...

  8. mem库系列函数合集(memset、memchr、memcmp、memcpy)

    关于Mem函数,网上五花八门,使初学者很容易迷失方向,笔者在这里做一个常用函数的总结.希望对读者起到些许帮助. 想了解Str系列函数的,请猛戳这里→Str系列函数大全 代码 //头文件:#includ ...

  9. Str库系列函数合集(strlen、strcpy、strcmp、strcat、strchr等)

    关于Str函数,网上五花八门,使初学者很容易迷失方向,笔者在这里做一个常用函数的总结.希望对读者起到些许帮助. 后续会持续更新特殊函数~ 想了解mem系列函数的,请猛戳这里→mem系列函数 代码 // ...

最新文章

  1. 引导分区 pbr 数据分析_如何在1小时内引导您的分析
  2. python打开指定文件-Python获取指定文件夹下的文件
  3. CTFshow 信息收集 web8
  4. 复盘王者荣耀手游开发全过程,Unity引擎使用帧同步放弃状态同步
  5. HDU - 6629 string matching(扩展KMP)
  6. C++ 多线程使用future传递异常
  7. 线程之售票系统pthread_mutex,_lock,_unlock
  8. 华为内部存储转sd卡_华为tit al00怎么将手机存储内容转移到sd卡
  9. 安装Lync Server 2013
  10. 手把手教你开发图片识别(QT篇)
  11. CPCI总线和VPX总线的区别
  12. 自学编程到底有多难?
  13. python判断两个矩形是否相交_使用Python判断线段是否与矩形相交
  14. 牛客网-前端刷题记录(简单级)
  15. 笔记本开热点手机一直显示正在获取ip
  16. 剖析top命令显示的VIRT RES SHR值
  17. Python批量转换文件夹下图片为PDF
  18. request_standard_resources
  19. shell判断所输整数是否为质数
  20. 车速与档位匹配关系_汽车档位与速度的匹配,速度与档位匹配的标准

热门文章

  1. MyBatis 如何兼容所有日志框架?
  2. 带你100% 地了解 Redis 6.0 的客户端缓存
  3. 阿里员工的Java问题排查工具单
  4. 入门经典综述!深度人脸识别算法串讲
  5. ELECTRA: 超越BERT, 19年最佳NLP预训练模型
  6. LaTex公式编辑方法
  7. 5分钟带你读「大清」微积分!160多年前清朝数学家撰写文言文版高等数学
  8. 2021入坑图像分割,我该从哪儿入手?
  9. 北大博士干了半年外卖骑手,写出 AI 伦理论文登上顶刊,“系统知道一切”
  10. 推荐一个论文复现神器!