我这里写了个简单的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采集,单线程比多线程还快?相关推荐

  1. Curl 采集乱码 gzip 原因及解决方案 utf-8

    Curl 采集乱码 gzip 原因及解决方案 utf-8 参考文章: (1)Curl 采集乱码 gzip 原因及解决方案 utf-8 (2)https://www.cnblogs.com/jiaosq ...

  2. webbrowser 百度列表点击_前嗅ForeSpider采集教程:关键词的「检索列表」采集「检索结果」...

    以百度搜索关键词(http://www.baidu.com)为例: 一. 网站结构 网站截图说明 使用批量关键词,从百度检索列表依次进入检索结果页,采集结果页里的正文数据. 检索列表页 检索结果页 2 ...

  3. api可以主动采集用户数据吗_模拟量数字量采集卡之EC-8001篇

    数据采集卡绝大多数集中在采集模拟量.数字量.热电阻.热电偶,其中热电阻可以认为是非电量,其实本质上还是要用电流驱动来采集,其中模拟量数据采集卡和数字量采集卡用得是最广泛的.如苏州市凌臣采集计算机有限公 ...

  4. 命令行下使用curl,采集数据遇到的问题。

    前几天遇到这样一个问题,写了一段php采集程序,里面用到了curl_init()等,在浏览器里可以获得数据,但在命令行里不可以 用的php环境是wamp,加载了php_curl, php.ini文件里 ...

  5. redis单线程为什么还快的个人解释

    面试的时候, 面试官问,redis是单线程还是多线程 答:单线程 面试官再问,单线程,为什么还快呢?不应该是多线程才更快吗?那这是不是有什么矛盾啊? 答:啊???......(心里卧槽,就是单线程所以 ...

  6. php中使用curl采集小说网,PHP:通过curl实现采集网站内容

    关于curl,请各位同学自行百度,我直接上案例. 首先开启你的curl拓展,在php.ini文件把curl拓展开启,即取消extension=php_curl.dll的分号. eg:利用curl采集网 ...

  7. 火车头采集ajax网址的技巧,使用post方法获得采集网址

    大家在采集列表分页的时候会遇到,点击下面的分页页面内容是改变了,但是浏览器地址却没有改变 ,这个种情况分页是post的方式,今天我们来说下这个种情况该如何获取分页,用这个网址 首先你要会使用fiddl ...

  8. java语言实现视频音频采集_详解js的视频和音频采集

    今天要写的,不是大家平时会用到的东西.因为兼容性实在不行,只是为了说明下前端原来还能干这些事. 大家能想象前端是能将摄像头和麦克风的视频流和音频流提取出来,再为所欲为的么.或者说我想把我canvas画 ...

  9. 拼多多商品详情采集上传京东店铺(拼多多商品详情接口,京东商品详情接口,整店宝贝采集接口,一键采集宝贝详情接口,无货源商品详情采集接口)代码对接教程

    拼多多商品详情采集上传京东店铺(拼多多商品详情接口,京东商品详情接口,整店宝贝采集接口,一键采集宝贝详情接口,无货源商品详情采集接口)代码对接教程如下: 1.公共参数 名称 类型 必须 描述(接口代码 ...

最新文章

  1. 重新理解微服务--转
  2. 连咖啡首席产品经理左弘帆:all in小程序前你想清楚了吗?
  3. Android adt 初步理解和分析(三)
  4. hdu (欧拉函数+容斥原理) GCD
  5. 苹果AirPods 2又有新消息了!具备防滑涂层和新配色
  6. C#.NET 大型通用信息化系统集成快速开发平台 4.6 版本 - SSO单点登录接口
  7. chmod是linux命令吗,Linux chmod命令怎么用
  8. @程序员,人到中年,你的保温杯里泡_____
  9. pandas pivot 计算占比_pandas使用9:如何处理时间序列数据
  10. Java的几个不错的网站
  11. Touchgfx - 4 - Bitmap Cache
  12. Windows桌面端录屏采集实现
  13. Redis及可视化工具安装
  14. win10免费sdk安装详细过程
  15. ai python 自动_Python - AI自动抠图
  16. 封基表现继续好于大盘
  17. EAUML日拱一卒-微信小程序实战:位置闹铃 (11)-稍微聪明一点
  18. vue样式 引入图片_vue-cli脚手架引入图片的几种方法总结
  19. python 之re模块(正规表达式)简单扯一下犊子
  20. ANR 弹窗的显示原理

热门文章

  1. 事件冒泡与事件捕获,附实例
  2. wildfly-9.0.2 web项目部署详细步骤
  3. 用例子来区分4种文法
  4. Python Mysql学习总结
  5. oracle null的解析
  6. 使用.net framework再发布的插件发布应用程序
  7. Spring的基本应用
  8. debug.keystore文件找不到
  9. 删除一行下方单元格上移_Excel小技巧——局部单元格的添加与删除
  10. linux网络协议栈 转发组播,Linux 网络协议栈开发基础篇(十)—— 组播(Multicast)基础...