curl模拟多线程


1.curl发送请求的请求的基本思路

  1. 打开会话
  2. 设置会话参数
  3. 发送请求
  4. 关闭句柄

2.curl单进程发送示例

<?php
//请求链接
$arr = [
    'https://www.yahoo.com/',
    'http://www.jtthink.com/',
    'https://www.hao123.com/',
    'http://www.cnblogs.com/loveyouyou616/',
    'http://www.qq.com/',
    'http://www.sina.com.cn/',
    'http://www.163.com/',
    'https://www.yahoo.com/',
    'http://www.jtthink.com/',
    'https://www.hao123.com/',
    'http://www.cnblogs.com/loveyouyou616/',
    'http://www.qq.com/',
    'http://www.sina.com.cn/',
    'http://www.163.com/',
    'https://www.yahoo.com/',
    'http://www.jtthink.com/',
    'https://www.hao123.com/',
    'http://www.cnblogs.com/loveyouyou616/',
    'http://www.qq.com/',
    'http://www.sina.com.cn/',
    'http://www.163.com/'
];
$headers = ['User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36',];
foreach ($arr as $key => $url) {
    //打开curl会话
    $ch = curl_init($url);
    //设置会话参数
    //设置curl传输选项
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch, CURLOPT_HTTPHEADER,$headers);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 20);
    //关闭https请求验证
    if (strpos($url,'https')){
        curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false );
        curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, 2 );
    }
    //执行curl会话
    $res = curl_exec($ch);
    //关闭curl会话并释放资源
    curl_close($ch);
}

3.curl模拟多线程发送实例

<?php
//脚本开始的毫秒时刻
$start = microtime(true);
//链接数组
$arr = [
  'https://www.yahoo.com/',
  'http://www.jtthink.com/',
  'https://www.hao123.com/',
  'http://www.cnblogs.com/loveyouyou616/',
  'http://www.qq.com/',
  'http://www.sina.com.cn/',
  'http://www.163.com/',
  'https://www.yahoo.com/',
  'http://www.jtthink.com/',
  'https://www.hao123.com/',
  'http://www.cnblogs.com/loveyouyou616/',
  'http://www.qq.com/',
  'http://www.sina.com.cn/',
  'http://www.163.com/',
  'https://www.yahoo.com/',
  'http://www.jtthink.com/',
  'https://www.hao123.com/',
  'http://www.cnblogs.com/loveyouyou616/',
  'http://www.qq.com/',
  'http://www.sina.com.cn/',
  'http://www.163.com/'
];
$headers = ['User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36',];
//打开一个curl批处理句柄
$mh = curl_multi_init();
foreach ($arr as $key => $url) {
  //初始化cURL会话
  $ch[$key] = curl_init($url);
  //设置curl传输选项
  curl_setopt($ch[$key],CURLOPT_RETURNTRANSFER,1);
  curl_setopt($ch[$key], CURLOPT_HTTPHEADER,$headers);
  curl_setopt($ch[$key], CURLOPT_HEADER, 0);
  curl_setopt($ch[$key], CURLOPT_TIMEOUT, 20);
  //关闭https请求验证
  if (strpos($url,'https')){
  curl_setopt ( $ch[$key], CURLOPT_SSL_VERIFYPEER, false );
  curl_setopt ( $ch[$key], CURLOPT_SSL_VERIFYHOST, 2 );
 }  //向批处理句柄中添加单独的curl句柄
  curl_multi_add_handle($mh, $ch[$key]);

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

//获取内容
foreach ($arr as $key => $url) {
  //返回获取的输出文本流
  $res[$key] = curl_multi_getcontent($ch[$key]);
  //关闭执行完的子句柄
  curl_close($ch[$key]);
}
$end = microtime(true) - $start;
file_put_contents(__DIR__ . '/exec_time.log', $end . PHP_EOL, FILE_APPEND);
echo $end;</pre>

4.说明

  • 上面的模型也存在一个问题,返回的时间依赖最长的请求,通俗的说就是结果数据要等所有http请求结束后一起返回,然后逐个处理数据。
优质内容筛选与推荐>>
1、转:集成平台 jira 的使用与方案
2、HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
3、网易考拉Android客户端网络模块设计
4、noip2018day1-赛道修建
5、如何把前端用ajax发过来的图片传到node上,并且用node保存在oss图片服务器上?


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号