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

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

2.curl单进程发送示例

  1. <?php
  2. //请求链接
  3. $arr = [
  4. 'https://www.yahoo.com/',
  5. 'http://www.jtthink.com/',
  6. 'https://www.hao123.com/',
  7. 'http://www.cnblogs.com/loveyouyou616/',
  8. 'http://www.qq.com/',
  9. 'http://www.sina.com.cn/',
  10. 'http://www.163.com/',
  11. 'https://www.yahoo.com/',
  12. 'http://www.jtthink.com/',
  13. 'https://www.hao123.com/',
  14. 'http://www.cnblogs.com/loveyouyou616/',
  15. 'http://www.qq.com/',
  16. 'http://www.sina.com.cn/',
  17. 'http://www.163.com/',
  18. 'https://www.yahoo.com/',
  19. 'http://www.jtthink.com/',
  20. 'https://www.hao123.com/',
  21. 'http://www.cnblogs.com/loveyouyou616/',
  22. 'http://www.qq.com/',
  23. 'http://www.sina.com.cn/',
  24. 'http://www.163.com/'
  25. ];
  26. $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',];
  27. foreach ($arr as $key => $url) {
  28. //打开curl会话
  29. $ch = curl_init($url);
  30. //设置会话参数
  31. //设置curl传输选项
  32. curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  33. curl_setopt($ch, CURLOPT_HTTPHEADER,$headers);
  34. curl_setopt($ch, CURLOPT_HEADER, 0);
  35. curl_setopt($ch, CURLOPT_TIMEOUT, 20);
  36. //关闭https请求验证
  37. if (strpos($url,'https')){
  38. curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false );
  39. curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, 2 );
  40. }
  41. //执行curl会话
  42. $res = curl_exec($ch);
  43. //关闭curl会话并释放资源
  44. curl_close($ch);
  45. }

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

  1. <?php
  2. //脚本开始的毫秒时刻
  3. $start = microtime(true);
  4. //链接数组
  5. $arr = [
  6. 'https://www.yahoo.com/',
  7. 'http://www.jtthink.com/',
  8. 'https://www.hao123.com/',
  9. 'http://www.cnblogs.com/loveyouyou616/',
  10. 'http://www.qq.com/',
  11. 'http://www.sina.com.cn/',
  12. 'http://www.163.com/',
  13. 'https://www.yahoo.com/',
  14. 'http://www.jtthink.com/',
  15. 'https://www.hao123.com/',
  16. 'http://www.cnblogs.com/loveyouyou616/',
  17. 'http://www.qq.com/',
  18. 'http://www.sina.com.cn/',
  19. 'http://www.163.com/',
  20. 'https://www.yahoo.com/',
  21. 'http://www.jtthink.com/',
  22. 'https://www.hao123.com/',
  23. 'http://www.cnblogs.com/loveyouyou616/',
  24. 'http://www.qq.com/',
  25. 'http://www.sina.com.cn/',
  26. 'http://www.163.com/'
  27. ];
  28. $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',];
  29. //打开一个curl批处理句柄
  30. $mh = curl_multi_init();
  31. foreach ($arr as $key => $url) {
  32. //初始化cURL会话
  33. $ch[$key] = curl_init($url);
  34. //设置curl传输选项
  35. curl_setopt($ch[$key],CURLOPT_RETURNTRANSFER,1);
  36. curl_setopt($ch[$key], CURLOPT_HTTPHEADER,$headers);
  37. curl_setopt($ch[$key], CURLOPT_HEADER, 0);
  38. curl_setopt($ch[$key], CURLOPT_TIMEOUT, 20);
  39. //关闭https请求验证
  40. if (strpos($url,'https')){
  41. curl_setopt ( $ch[$key], CURLOPT_SSL_VERIFYPEER, false );
  42. curl_setopt ( $ch[$key], CURLOPT_SSL_VERIFYHOST, 2 );
  43. } //向批处理句柄中添加单独的curl句柄
  44. curl_multi_add_handle($mh, $ch[$key]);
  45. }
  46. $running = null;
  47. //执行批处理句柄
  48. do {
  49. curl_multi_exec($mh, $running);
  50. } while($running > 0);
  51. //获取内容
  52. foreach ($arr as $key => $url) {
  53. //返回获取的输出文本流
  54. $res[$key] = curl_multi_getcontent($ch[$key]);
  55. //关闭执行完的子句柄
  56. curl_close($ch[$key]);
  57. }
  58. $end = microtime(true) - $start;
  59. file_put_contents(__DIR__ . '/exec_time.log', $end . PHP_EOL, FILE_APPEND);
  60. 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. 论文阅读笔记五十八:FoveaBox: Beyond Anchor-based Object Detector(CVPR2019)

    论文原址:https://arxiv.org/abs/1904.03797 摘要 FoveaBox属于anchor-free的目标检测网络,FoveaBox直接学习可能存在的图片种可能存在的目标,这期 ...

  2. Linux学习笔记-第9天 与windows相同的分区知识

    可能是因为之前自己已经对分区.引导.操作系统已经有了足够的认知和实践经验,也可能是因为这个知识已经看了三遍的原因.最近笔记有点少. 不是特别同意老师 新硬盘也可以不分区的关点.默认硬盘不分区应该是不能 ...

  3. 复杂模拟 | 1014 模拟K个同时到来的人在N个窗口,每个窗口只能站M个人的银行排队

    这题我以为还是之前银行排队的思路,但是做着做着就做不下去了了.看了答案我才理解到底是什么个思路. 是这样的:不同于之前排队的题,这里的K个人是同时到来的.所以首先应该让K个人的前N*M(也就是黄线内的 ...

  4. 日常歌颂zyj

    今年的中秋节... 我貌似遇到了一个灰常 灰常灰常优秀的 大哥哥~~ (貌似是条高二狗) 最开始在贴吧颓废... 然后... 开始逐条的回复... 开始去,,, 逐步查看,,, 发现这个优秀的楼主会 ...

  5. IAR环境搭建

    工具下载:https://pan.baidu.com/s/1nwv0RVz 第一步:右键点击EW8051-EV-8103-Web.exe,使用管理员权限运行. 第二步:我们运行之后只要一直Next下去 ...

  6. [ZJOI2019]线段树(线段树,DP)

    又是神仙题. 要写博客太长了,先咕着.放个代码先. 为什么 fmul 在 linux 底下还被定义过了--能想象到我一发 CE 的绝望吗 qaq #include<bits/stdc++.h&g ...

  7. [BJOI2014]想法(随机算法,神奇思路,拓扑排序)

    对于这种随机数据或者随机算法的题-- 都是神仙题吧. 要求的就是对每个点前 \(m\) 个点中有多少个可以到达它. 由于评分方式这么奇怪,不妨考虑随机. 随机 127 次(可以选别的数,够多而且不 T ...

  8. Node.js安装使用-VueCLI安装使用-工程化的Vue.js开发

    作者 | Jeskson 来源 | 达达前端小酒馆 搭建Node.js环境 什么是Node.js简介呢?它是一个基于JavaScript的运行环境,Node.js发布于2009年5月,对Chrome ...

  9. [LeetCode] 352. Data Stream as Disjoint Intervals 分离区间的数据流

    Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...

  10. multiply two numbers using + opertor

    public class Solution { public static void main(String[] args) { , y = ; ; ; i <= y; i++) res = i ...