使用file_get_content系列函数和使用curl系列函数采集图片的性能对比
由于公司的一个汽车网站的后台的汽车内容都是主要是来自与汽车之家的,编辑的同事们必须天天手动去对着汽车之家来添加汽车,实在是太蛋疼了。于是乎,为了改变这种状况,作为一个开发码农,我的任务就来了。。。那就是准备做一个功能,只要粘贴对应的汽车之家的网址url就能对这些数据进行自动填充到我们后台的表单中,目前基本的填充都实现了,但是还是没有能够把对应的汽车相册采集进来。
采集图片的功能我以前也做过,但是汽车之家大部分的汽车都有挺多图片的,开始的时候,我打算使用以前的采集图片的办法,也就是使用file_get_content获取url对应的内容,然后匹配到图片的地址,再使用file_get_content获取这些图片url的内容,再载入到本地去,代码如下:
<?php
header('Content-type:text/html;charset=utf-8');
set_time_limit(0); class runtime
{
var $StartTime = 0;
var $StopTime = 0; function get_microtime()
{
list($usec, $sec) = explode(' ', microtime());
return ((float)$usec + (float)$sec);
} function start()
{
$this->StartTime = $this->get_microtime();
} function stop()
{
$this->StopTime = $this->get_microtime();
} function spent()
{
return round(($this->StopTime - $this->StartTime) * 1000, 1);
} } $runtime= new runtime();
$runtime->start(); $url = 'http://car.autohome.com.cn/pic/series-s15306/289.html#pvareaid=102177';
$rs = file_get_contents($url);
// echo $rs;exit;
preg_match_all('/(\/pic\/series-s15306\/289-\d+\.html)/', $rs, $urlArr); $avalie = array_unique($urlArr[0]);
$count = array();
foreach ($avalie as $key => $ul) {
$pattern = '/<img src="(http:\/\/car1\.autoimg\.cn\/upload\/\d+\/\d+\/\d+\/.*?\.jpg)"/';
preg_match_all($pattern, file_get_contents('http://car.autohome.com.cn'.$ul), $imgSrc);
$count = array_merge($count, $imgSrc[1]);
} foreach($count as $k=>$v) {
$data[$k] = file_get_contents($v);
} foreach($data as $k=>$v) {
file_put_contents('./pic2/'.time().'_'.rand(1, 10000).'.jpg', $v);
} $runtime->stop();
echo "页面执行时间: ".$runtime->spent()." 毫秒";
结果发现,这种方法少图片还好,图片多了,那是相当的卡。。就本地测试也比较难跑,更不如说到时候上线了。百度之后,我采用了curl的办法来下载图片,经过测试后的确有所改善,但是感觉还是有点慢,要是php有多线程那有多好。。。
又经过一番折腾和找资料,发现php的curl库其实还是可以模拟多线程的,那就是使用curl_multi_*系列的函数,经过改写,代码又变成了这样:
<?php
header('Content-type:text/html;charset=utf-8');
set_time_limit(0); class runtime
{
var $StartTime = 0;
var $StopTime = 0; function get_microtime()
{
list($usec, $sec) = explode(' ', microtime());
return ((float)$usec + (float)$sec);
} function start()
{
$this->StartTime = $this->get_microtime();
} function stop()
{
$this->StopTime = $this->get_microtime();
} function spent()
{
return round(($this->StopTime - $this->StartTime) * 1000, 1);
} } $runtime= new runtime();
$runtime->start(); $url = 'http://car.autohome.com.cn/pic/series-s15306/289.html#pvareaid=102177';
$rs = file_get_contents($url);
preg_match_all('/(\/pic\/series-s15306\/289-\d+\.html)/', $rs, $urlArr); $avalie = array_unique($urlArr[0]);
$count = array();
foreach ($avalie as $key => $ul) {
$pattern = '/<img src="(http:\/\/car1\.autoimg\.cn\/upload\/\d+\/\d+\/\d+\/.*?\.jpg)"/';
preg_match_all($pattern, file_get_contents('http://car.autohome.com.cn'.$ul), $imgSrc);
$count = array_merge($count, $imgSrc[1]);
} $handle = curl_multi_init(); foreach($count as $k => $v) {
$curl[$k] = curl_init($v);
curl_setopt($curl[$k], CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl[$k], CURLOPT_HEADER, 0);
curl_setopt($curl[$k], CURLOPT_TIMEOUT, 30);
curl_multi_add_handle ($handle, $curl[$k]);
} $active = null; do {
$mrc = curl_multi_exec($handle, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active && $mrc == CURLM_OK) {
// 这句在php5.3以后的版本很关键,因为没有这句,可能curl_multi_select可能会永远返回-1,这样就永远死在循环里了
while (curl_multi_exec($handle, $active) === CURLM_CALL_MULTI_PERFORM); if (curl_multi_select($handle) != -1) {
do {
$mrc = curl_multi_exec($handle, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
} foreach ($curl as $k => $v) {
if (curl_error($curl[$k]) == "") {
$data[$k] = curl_multi_getcontent($curl[$k]);
}
curl_multi_remove_handle($handle, $curl[$k]);
curl_close($curl[$k]);
} foreach($data as $k=>$v) {
$file = time().'_'.rand(1000, 9999).'.jpg';
file_put_contents('./pic3/'.$file, $v);
} curl_multi_close($handle); $runtime->stop();
echo "页面执行时间: ".$runtime->spent()." 毫秒";
好了,多线程的采集真是非常酸爽,然后通过一系列的测试和对比,5次测试,curl多线程有4次是快于file_get_content的,而且时间还是file_get_content的3~5倍,总结起来,以后采集都尽量使用这种办法,提高效率不在话下。
使用file_get_content系列函数和使用curl系列函数采集图片的性能对比的更多相关文章
- json系列(三)cjson,rapidjson,yyjson解析性能对比
前言 本篇对cjson,rapidjson,yyjson三种json反序列化工具的性能进行对比. 有json样本数据如下: 实验环境: cpu:Xeon cpu主频:2.20GHz 以下示例均未对字段 ...
- OCIlib的几个函数的执行效率(附上pro*c的性能对比)
ocilib提供了以下几个执行sql语句的函数 OCI_ExecuteStmt/OCI_ExecuteStmtFmt 使用没有绑定变量的语句 OCI_Execute 使用有绑定变量的语句 OCI_Im ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数017·point点函数
<zw版·Halcon-delphi系列原创教程> Halcon分类函数017·point点函数 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“p ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数015,vector矢量
<zw版·Halcon-delphi系列原创教程> Halcon分类函数015,vector矢量 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“p ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数016,xld,xld轮廓
<zw版·Halcon-delphi系列原创教程> Halcon分类函数016,xld,xld轮廓 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“ ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数014,tuple,元组
<zw版·Halcon-delphi系列原创教程> Halcon分类函数014,tuple,元组 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“p ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数013,shape模型
<zw版·Halcon-delphi系列原创教程> Halcon分类函数013,shape模型 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“pr ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数012,polygon,多边形
<zw版·Halcon-delphi系列原创教程> Halcon分类函数012,polygon,多边形 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换 ...
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数011,ocr,字符识别
<zw版·Halcon-delphi系列原创教程> Halcon分类函数011,ocr,字符识别 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“p ...
随机推荐
- css基础之 id和选择器
id 和 class 选择器 如果你要在HTML元素中设置CSS样式,你需要在元素中设置"id" 和 "class"选择器. (1) id 选择器 id 选择器 ...
- 导出kettle数据转换设置
在本地测试好的数据清洗配置,要转移到服务器上,就要用到导出数据转换设置. 一直是这使用是在导入设置的 时候总是提示不是kettle的文档格式.后来才发现这是资源库的配置,而不是数据转 换的配置. 导出 ...
- php 数组 array_values () array_key()
<?php // array_unique($array) 去除重复 // array_unshif()向数组的顶部追加函数 // array_shif($a,"ss")向数 ...
- 资源回收 left
select DISTINCT human.tid,log_pv_change.systafftid from human left join human_user on human.tid=huma ...
- Yii在nginx下多目录rewrite
开发过程中,在root下有多个程序,采用一个域名,以目录的形式访问,可以采用如下的方法进行url重写: rewrite ^(\/[^\/]+)(.*) $1/index.php$2 last; 意为取 ...
- UI原则之-拼车
1.简洁------------一目了然,简洁明了 2.易用------------操作方便 3.直观.快速-------快速定位到所需信息 4.友好-------网络延时.超时.等待 5.易懂--- ...
- COB對PCB設計的要求
由於COB沒有IC封裝的leadframe(導線架),而是用PCB來取代,所以PCB的焊墊設計就便得非常的重要,而且Fihish只能使用電鍍金或是ENIG(化鎳浸金),否則金線或是鋁線,甚至是最新的銅 ...
- Starling开发微信打灰机(二)
上一篇中,已经把starling开发环境搭建好,那么现在开始写代码. 这一篇来完成打灰机的欢迎界面. 游戏素材下载 首先创建Asset.as来加载图片,声音和字体等资源,其中只有两张背景图是单独的图片 ...
- PF_RING packet overwrites
最近在用 PF_RING 抓包过程中,发现个灵异的现象,高流量丢包时, 经常会出现正在处理的包的内容被覆盖.开始,怀疑是不是自己程序有地方越界写了,后来发现,如果自己拷贝一份,然后处理拷贝的那份,永远 ...
- C语言运算符的优先级
熟悉C语言的同学都知道,C语言众多的运算符及繁琐难记的优先级总是搞得我们这些C初学者头大.那么本文就 对C语言中所有的运算符进行汇总,并对其优先级进行一定的介绍. 这里虽然对所有C运算符的优先级进行了 ...