curl模拟多线程
1.curl发送请求的请求的基本思路
- 打开会话
- 设置会话参数
- 发送请求
- 关闭句柄
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模拟多线程的更多相关文章
- php使用curl模拟多线程发送请求
每个PHP文件的执行是单线程的,但是php本身也可以用一些别的技术实现多线程并发比如用php-fpm进程,这里用curl模拟多线程发送请求.php的curl多线程是通过不断调用curl_multi_e ...
- 利用curl 模拟多线程
所谓多线程就是多个 程序同时运行,单线程:执行一段逻辑,等待完成后 在执行另外一个. 多线程:几个逻辑同时进行处理,不需要相互等待,提高了总的执行时间 接下来就用curl实现多线程 实现逻辑 1. f ...
- 通过curl模拟多线程抓取网页(curl_multi_*)
curl请求多个url,以前都是使用循环来处理.最近发现可以通过curl_multi_*系列函数来模拟多线程.比对一下,发现如果请求的url只有几个,2种方案耗时差不多,但是url比较多,差距就非常明 ...
- curl模拟多线程抓取网页(优化)
通过上篇文章清楚了通过curl_multi_*函数可以一次请求多个url,但是也留下了问题,就是结果要等所有数据请求结束一起返回,才能逐个处理数据.优化代码,使先成功请求的url先返回处理结果,而不是 ...
- CURL 模拟http提交
1:CURL模拟get提交 private function httpGet($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_RETUR ...
- PHP 之 CURL 模拟登陆并获取数据
1.CURL模拟登陆的流程和步骤 2.tempnam 创建一个临时文件 3.使用CURL模拟登陆到PHP100论坛 <?php $cookie_file = tempnam('./temp',' ...
- curl模拟自动登陆&采集网页数据
<!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content=&quo ...
- php 的curl 模拟登陆
做一个类似这样的web 应用. 1,解决掉验证码 其实这是正方的一个小bug,当我们进入登陆界面时,浏览器会去请求服务器,服务器会生成一个验证码图片.如果我们不去请求这个图片,那么正方后台也不会生成相 ...
- 【转】PHP 之 CURL 模拟登陆并获取数据
1.CURL模拟登陆的流程和步骤2.tempnam 创建一个临时文件3.使用CURL模拟登陆到PHP100论坛 <?php$cookie_file = tempnam('./temp','coo ...
随机推荐
- 四则运算web版需求规格说明书
目录 1引言... 4 1.1 目的... 4 1.2 背景... 4 1.3 术语... 4 1.4 预期读者与阅读建议... 5 1.5 参考资料... 6 1.6 需求描述约定... ...
- sed和awk练习及知识点
一.针对/etc/passwd操作 1.sed操作,将文件中的第九行至第十五行复制到第16行下. [root@ns1 lianxi]# sed '9,15H;16G' /etc/passwd 2.用a ...
- [LeetCode] 119. Pascal's Triangle II 杨辉三角之二
Given a non-negative index k where k ≤ 33, return the kth index row of the Pascal's triangle. Note t ...
- Spring Cloud Zuul记录接口响应数据
系统在生产环境出现问题时,排查问题最好的方式就是查看日志了,日志的记录尽量详细,这样你才能快速定位问题. 如果需要在Zuul中进行详细的日志记录,这两种日志必不可少. API请求信息 API响应信息 ...
- 官方入门教程和文档 | Visual Studio
Visual Studio 2017 概述 | Microsoft Docs(直接教你用vs) https://docs.microsoft.com/zh-cn/visualstudio/ide/vi ...
- QLayout及其子类 清除添加的widget
起初,我的思路是,先取得Layout的items数量, 然后通过索引来移除每一个items,代码如下: QHBoxLayout * hly = new QHBoxLayout; ; i < ; ...
- 转 A 、B两张表,找出ID字段中,存在A表,但是不存在B表的数据
A.B两张表,找出ID字段中,存在A表,但是不存在B表的数据,A表总共13W数据,去重后大约3万条数据,B表有2W条数据,且B表的ID有索引. 方法一 使用not in,容易理解,效率低. selec ...
- Eclipse JAX-RS (REST Web Services) 2.0 requires Java 1.6 or newer
pom.xml文件中添加: <build> <plugins> <plugin> <groupId>org.apache.maven.plugins&l ...
- MySQL 中获取用户表、用户视图、用户表中列信息
直接贴代码了: /// <summary> /// MySql 数据库维护中心 /// </summary> public class MySqlDbMaintenance:D ...
- 两数相加II--链表
题目 给定两个非空链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每个节点只存储单个数字.将这两数相加会返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 进阶: ...