何起:

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

  前人做了这样一个事儿:页面分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没有经过实践测试

欢迎阅者批评指正

笔者:一般的小帅

  

最新文章

  1. ASP.net MVC 文件下载的几种方法(欢迎讨论)
  2. 为何Redis要比Memcached好用(转)
  3. __slots__ 属性绑定
  4. 关于sizeof的笔试面试题具体解释
  5. hello MemSQL 入门安装演示样例
  6. 设置ios中imageView图片自适应,
  7. day001-html知识点总结(-)块级。行内元素区分
  8. Springboot(一):使用Intellij中的Spring Initializr来快速构建Spring Boot工程
  9. CF922 CodeForces Round #461(Div.2)
  10. RHEL7/CentOS7 安装Zabbix
  11. seaJS简介和完整实例
  12. PHP错误日志记录:display_errors与log_errors的区别
  13. Linux 关闭网络管理服务
  14. pyqt4 利用信号槽在子线程里面操作Qt界面
  15. Best practices for Express app structure
  16. 开发中遇到的一些mongoose的问题
  17. FreeMaker常用方法
  18. 48. Rotate Image (Array)
  19. 三维模型 DAE 导出格式结合 OpenGLES 要素浅析
  20. Qt计算两个时间差

热门文章

  1. iOS蓝牙交互(4.0)
  2. C语言中复数运算及调用blas,lapack中复数函数进行科学计算
  3. Java线程:线程栈模型
  4. 用shell批量编码转换
  5. 【&#9733;】KMP算法完整教程
  6. 【java】关于java类和对象,你想知道的在这里!
  7. Matlab生成.exe可执行程序
  8. 201521123106 《Java程序设计》第7周学习总结
  9. 三级菜单的实现(python程序)
  10. 软件测试的cookie测试