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请求结束后一起返回,然后逐个处理数据。

curl模拟多线程的更多相关文章

  1. php使用curl模拟多线程发送请求

    每个PHP文件的执行是单线程的,但是php本身也可以用一些别的技术实现多线程并发比如用php-fpm进程,这里用curl模拟多线程发送请求.php的curl多线程是通过不断调用curl_multi_e ...

  2. 利用curl 模拟多线程

    所谓多线程就是多个 程序同时运行,单线程:执行一段逻辑,等待完成后 在执行另外一个. 多线程:几个逻辑同时进行处理,不需要相互等待,提高了总的执行时间 接下来就用curl实现多线程 实现逻辑 1. f ...

  3. 通过curl模拟多线程抓取网页(curl_multi_*)

    curl请求多个url,以前都是使用循环来处理.最近发现可以通过curl_multi_*系列函数来模拟多线程.比对一下,发现如果请求的url只有几个,2种方案耗时差不多,但是url比较多,差距就非常明 ...

  4. curl模拟多线程抓取网页(优化)

    通过上篇文章清楚了通过curl_multi_*函数可以一次请求多个url,但是也留下了问题,就是结果要等所有数据请求结束一起返回,才能逐个处理数据.优化代码,使先成功请求的url先返回处理结果,而不是 ...

  5. CURL 模拟http提交

    1:CURL模拟get提交 private function httpGet($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_RETUR ...

  6. PHP 之 CURL 模拟登陆并获取数据

    1.CURL模拟登陆的流程和步骤 2.tempnam 创建一个临时文件 3.使用CURL模拟登陆到PHP100论坛 <?php $cookie_file = tempnam('./temp',' ...

  7. curl模拟自动登陆&采集网页数据

    <!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content=&quo ...

  8. php 的curl 模拟登陆

    做一个类似这样的web 应用. 1,解决掉验证码 其实这是正方的一个小bug,当我们进入登陆界面时,浏览器会去请求服务器,服务器会生成一个验证码图片.如果我们不去请求这个图片,那么正方后台也不会生成相 ...

  9. 【转】PHP 之 CURL 模拟登陆并获取数据

    1.CURL模拟登陆的流程和步骤2.tempnam 创建一个临时文件3.使用CURL模拟登陆到PHP100论坛 <?php$cookie_file = tempnam('./temp','coo ...

随机推荐

  1. USACO Building Roads

    洛谷 P2872 [USACO07DEC]道路建设Building Roads 洛谷传送门 JDOJ 2546: USACO 2007 Dec Silver 2.Building Roads JDOJ ...

  2. vim目录树

    使用vim插件:显示树形目录插件NERDTree 安装方法很简单,先把压缩文件下载下来,解压后将plugin目录下的NERD_tree.vim拷贝~/.vim/plugin以及doc目录下的NERD_ ...

  3. Swagger2边写代码边写文档

    ​ 作为一个开发人员最怕的就是写文档了,但是要想成为一个合格的程序员,写好文档也是一个必备的技能.开发中我们经常要写接口服务,既然是服务就要跟别人对接,那难免要写接口文档,那么如何”优雅“的写接口文档 ...

  4. 第30课 线程同步(std::condition_variable)

    一. 条件变量 (一)条件变量概述 多线程访问一个共享资源(或称临界区),不仅需要用互斥锁实现独享访问避免并发错误,在获得互斥锁进入临界区后,还需检查特定条件是否成立.当某个线程修改测试条件后,将通知 ...

  5. Adams宏导出

    var set var=ip integer_value=1 var set var=macro_name str="" for variable_name=the_macro o ...

  6. server 2012 r2 配置

    filezilla的问题还是让人摸不着头脑,配置和别的机器上一样就是报STL权限错误,最后换了个端口就连上了. 服务器,填远端IP,被动模式打开,生成一个证书,被动模式的商品一定要在入站规则里 客户端 ...

  7. Java8 新特性 Stream 练习实例

    练习实例 配合Java8 新特性 Steam() API 使用 //没有写get set 构造方法 public class Sku { private Integer skuId; private ...

  8. Sitecore XP 8.2 新功能

    Sitecore的®体验平台™ 8.2是最全面的更新最新的一个,平衡增强现有客户,而在同一时间提供了引人注目的新功能.你可以在这里阅读新闻稿,但我想对8.2中的一些重大变化给予一些额外的关注.作为奖励 ...

  9. 很好的OpenCV入门资料

    https://files.cnblogs.com/files/mqingqing123/OpenCV%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B.rar

  10. .NET MVC 支付宝支付(即时到账)

    已经好久没有搞过.NET了,朋友有一个网站 ,需要接入支付宝功能,重新对接了一下. 1.开发前,需要一个企业支付宝账号登录,获取 PID和 配置密钥 官方文档:https://docs.open.al ...