php采集单线程卡死,php - 为什么我这段curl采集,单线程比多线程还快?
我这里写了个简单的curl采集,但是执行后发现单线程执行的方式比多线程执行要快很多.
是我的写法又问题吗?
$images = [
"http://pic.91taojin.com.cn/data/attachment/image/20140415/20140415151923_73502.jpg",
"http://pic.91taojin.com.cn/data/attachment/image/20140415/20140415151826_52170.jpg",
"http://pic.91taojin.com.cn/data/attachment/image/20140415/20140415152035_59698.jpg",
"http://pic.91taojin.com.cn/data/attachment/image/20140507/20140507143708_26688.jpg",
"http://pic.91taojin.com.cn/data/attachment/image/20140417/20140417095153_61993.jpg",
"http://pic.91taojin.com.cn/data/attachment/image/20140426/20140426094716_96396.jpg",
"http://pic.91taojin.com.cn/data/attachment/image/20130730/20130730160625_21437.jpg",
"http://pic.91taojin.com.cn/data/attachment/image/20130731/20130731170502_90104.jpg",
"http://pic.91taojin.com.cn/data/attachment/image/20130731/20130731165147_80414.jpg",
"http://pic.91taojin.com.cn/data/attachment/image/20140415/20140415151923_73502.jpg",
];
这个是单线程的函数:
function getImg($url = "", $filename = "")
{
$ch = curl_init ();
$opt [CURLOPT_URL] = $url;
$opt [CURLOPT_HEADER] = true;
$opt [CURLOPT_CONNECTTIMEOUT] = 10;
$opt [CURLOPT_TIMEOUT] = 60;
$opt [CURLOPT_AUTOREFERER] = true;
$opt [CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11';
$opt [CURLOPT_RETURNTRANSFER] = true;
// $opt [CURLOPT_FOLLOWLOCATION] = true; //跟随重定向
// $opt [CURLOPT_MAXREDIRS] = 10;
curl_setopt_array ( $ch, $opt );
$r = curl_exec ( $ch );
if (false === $r) {
$errno = curl_errno ( $ch );
$err = curl_error ( $ch );
curl_close ( $ch );
return false;
}
// 鉴定一下header:200 才写入文件
$header = explode("\r\n\r\n", $r);
if (strpos($header[0], 'HTTP/1.1 200') === 0) {
file_put_contents($filename, $header[1]);
}
curl_close ( $ch );
return true;
}
又尝试用curl_multi系列函数,但直接看的手册,没完全弄明白:
// 多线程采集数据
function getImgMulti($url=[] , $filename=[]){
// 创建批处理cURL句柄
$mh = curl_multi_init();
// 这里可以加n=10个线程
foreach ($url as $k => $v ) {
$ch[$k] = curl_init();
$opt [CURLOPT_URL] = $v;
$opt [CURLOPT_HEADER] = true;
$opt [CURLOPT_CONNECTTIMEOUT] = 10;
$opt [CURLOPT_TIMEOUT] = 60;
$opt [CURLOPT_AUTOREFERER] = true;
$opt [CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11';
$opt [CURLOPT_RETURNTRANSFER] = true;
// $opt [CURLOPT_FOLLOWLOCATION] = true; //跟随重定向
// $opt [CURLOPT_MAXREDIRS] = 10;
curl_setopt_array ( $ch[$k], $opt );
// 增加1个句柄
curl_multi_add_handle($mh,$ch[$k]);
}
$running=null;
// 执行批处理句柄
do {
curl_multi_exec($mh,$running);
} while($running > 0);
for ($i=0; $i < 10; $i++) {
$r = curl_multi_getcontent($ch[$i]);
// 鉴定一下header:200 才写入文件
$header = explode("\r\n\r\n", $r);
if (strpos($header[0], 'HTTP/1.1 200') === 0) {
file_put_contents('pics/'.$i.'.jpg', $header[1]);
}
}
// 关闭全部句柄
// curl_multi_remove_handle($mh, $ch1);
curl_multi_close($mh);
}
执行结果,循环执行单线程大约1.7秒完成,后面这个3.5秒完成.
可能是我对这个函数的用法没弄透,请哪位来解释下原因?
----后续补充----
我在windows上面测试的,难道说因为win的php多线程有别的问题?
另外还参考了别人写好的php类
http://blog.eiodesign.com/archives/86
用这个类库又做了一遍采集,结果还是一样,更慢了
// 测试库采集
require("libs/class_curl_multi.php");
$mp = new MultiHttpRequest();
//远程图片本地化
$mp->set_urls($images);
$images_result = $mp->start();
foreach ((array)$images_result as $image_key => $image_value) {
if (!empty($image_key)) {
_flush("store image:".$image_key."
");
file_put_contents('pics/'.$image_key.'.jpg',$image_value);
}
}
用时4.05秒
是因为我对这个php的多线程理解有问题,还是其他原因造成这种差距呢? 貌似多线程并没有提高采集效率.反而影响了.
php采集单线程卡死,php - 为什么我这段curl采集,单线程比多线程还快?相关推荐
- Curl 采集乱码 gzip 原因及解决方案 utf-8
Curl 采集乱码 gzip 原因及解决方案 utf-8 参考文章: (1)Curl 采集乱码 gzip 原因及解决方案 utf-8 (2)https://www.cnblogs.com/jiaosq ...
- webbrowser 百度列表点击_前嗅ForeSpider采集教程:关键词的「检索列表」采集「检索结果」...
以百度搜索关键词(http://www.baidu.com)为例: 一. 网站结构 网站截图说明 使用批量关键词,从百度检索列表依次进入检索结果页,采集结果页里的正文数据. 检索列表页 检索结果页 2 ...
- api可以主动采集用户数据吗_模拟量数字量采集卡之EC-8001篇
数据采集卡绝大多数集中在采集模拟量.数字量.热电阻.热电偶,其中热电阻可以认为是非电量,其实本质上还是要用电流驱动来采集,其中模拟量数据采集卡和数字量采集卡用得是最广泛的.如苏州市凌臣采集计算机有限公 ...
- 命令行下使用curl,采集数据遇到的问题。
前几天遇到这样一个问题,写了一段php采集程序,里面用到了curl_init()等,在浏览器里可以获得数据,但在命令行里不可以 用的php环境是wamp,加载了php_curl, php.ini文件里 ...
- redis单线程为什么还快的个人解释
面试的时候, 面试官问,redis是单线程还是多线程 答:单线程 面试官再问,单线程,为什么还快呢?不应该是多线程才更快吗?那这是不是有什么矛盾啊? 答:啊???......(心里卧槽,就是单线程所以 ...
- php中使用curl采集小说网,PHP:通过curl实现采集网站内容
关于curl,请各位同学自行百度,我直接上案例. 首先开启你的curl拓展,在php.ini文件把curl拓展开启,即取消extension=php_curl.dll的分号. eg:利用curl采集网 ...
- 火车头采集ajax网址的技巧,使用post方法获得采集网址
大家在采集列表分页的时候会遇到,点击下面的分页页面内容是改变了,但是浏览器地址却没有改变 ,这个种情况分页是post的方式,今天我们来说下这个种情况该如何获取分页,用这个网址 首先你要会使用fiddl ...
- java语言实现视频音频采集_详解js的视频和音频采集
今天要写的,不是大家平时会用到的东西.因为兼容性实在不行,只是为了说明下前端原来还能干这些事. 大家能想象前端是能将摄像头和麦克风的视频流和音频流提取出来,再为所欲为的么.或者说我想把我canvas画 ...
- 拼多多商品详情采集上传京东店铺(拼多多商品详情接口,京东商品详情接口,整店宝贝采集接口,一键采集宝贝详情接口,无货源商品详情采集接口)代码对接教程
拼多多商品详情采集上传京东店铺(拼多多商品详情接口,京东商品详情接口,整店宝贝采集接口,一键采集宝贝详情接口,无货源商品详情采集接口)代码对接教程如下: 1.公共参数 名称 类型 必须 描述(接口代码 ...
最新文章
- 重新理解微服务--转
- 连咖啡首席产品经理左弘帆:all in小程序前你想清楚了吗?
- Android adt 初步理解和分析(三)
- hdu (欧拉函数+容斥原理) GCD
- 苹果AirPods 2又有新消息了!具备防滑涂层和新配色
- C#.NET 大型通用信息化系统集成快速开发平台 4.6 版本 - SSO单点登录接口
- chmod是linux命令吗,Linux chmod命令怎么用
- @程序员,人到中年,你的保温杯里泡_____
- pandas pivot 计算占比_pandas使用9:如何处理时间序列数据
- Java的几个不错的网站
- Touchgfx - 4 - Bitmap Cache
- Windows桌面端录屏采集实现
- Redis及可视化工具安装
- win10免费sdk安装详细过程
- ai python 自动_Python - AI自动抠图
- 封基表现继续好于大盘
- EAUML日拱一卒-微信小程序实战:位置闹铃 (11)-稍微聪明一点
- vue样式 引入图片_vue-cli脚手架引入图片的几种方法总结
- python 之re模块(正规表达式)简单扯一下犊子
- ANR 弹窗的显示原理