목차
使用file_get_content系列函数和使用curl系列函数采集图片的性能对比,curl函数
백엔드 개발 PHP 튜토리얼 使用file_get_content系列函数和使用curl系列函数采集图片的性能对比,curl函数_PHP教程

使用file_get_content系列函数和使用curl系列函数采集图片的性能对比,curl函数_PHP教程

Jul 13, 2016 am 10:01 AM
c content curl file get 사용 기능 그리고 그림 차이 성능 ~의 시리즈 수집

使用file_get_content系列函数和使用curl系列函数采集图片的性能对比,curl函数

  由于公司的一个汽车网站的后台的汽车内容都是主要是来自与汽车之家的,编辑的同事们必须天天手动去对着汽车之家来添加汽车,实在是太蛋疼了。于是乎,为了改变这种状况,作为一个开发码农,我的任务就来了。。。那就是准备做一个功能,只要粘贴对应的汽车之家的网址url就能对这些数据进行自动填充到我们后台的表单中,目前基本的填充都实现了,但是还是没有能够把对应的汽车相册采集进来。

  采集图片的功能我以前也做过,但是汽车之家大部分的汽车都有挺多图片的,开始的时候,我打算使用以前的采集图片的办法,也就是使用file_get_content获取url对应的内容,然后匹配到图片的地址,再使用file_get_content获取这些图片url的内容,再载入到本地去,代码如下:

<?<span>php
</span><span>header</span>('Content-type:text/html;charset=utf-8'<span>);
</span><span>set_time_limit</span>(0<span>);

</span><span>class</span><span> runtime  
{  
    </span><span>var</span> <span>$StartTime</span> = 0<span>;  
    </span><span>var</span> <span>$StopTime</span> = 0<span>;  
   
    </span><span>function</span><span> get_microtime()  
    {  
        </span><span>list</span>(<span>$usec</span>, <span>$sec</span>) = <span>explode</span>(' ', <span>microtime</span><span>());  
        </span><span>return</span> ((<span>float</span>)<span>$usec</span> + (<span>float</span>)<span>$sec</span><span>);  
    }  
   
    </span><span>function</span><span> start()  
    {  
        </span><span>$this</span>->StartTime = <span>$this</span>-><span>get_microtime();  
    }  
   
    </span><span>function</span><span> stop()  
    {  
        </span><span>$this</span>->StopTime = <span>$this</span>-><span>get_microtime();  
    }  
   
    </span><span>function</span><span> spent()  
    {  
        </span><span>return</span> <span>round</span>((<span>$this</span>->StopTime - <span>$this</span>->StartTime) * 1000, 1<span>);  
    }  
   
}  

</span><span>$runtime</span>= <span>new</span><span> runtime();  
</span><span>$runtime</span>-><span>start();  

</span><span>$url</span> = 'http://car.autohome.com.cn/pic/series-s15306/289.html#pvareaid=102177'<span>;
</span><span>$rs</span> = <span>file_get_contents</span>(<span>$url</span><span>);
</span><span>//</span><span> echo $rs;exit;</span>
<span>preg_match_all</span>('/(\/pic\/series-s15306\/289-\d+\.html)/', <span>$rs</span>, <span>$urlArr</span><span>);

</span><span>$avalie</span> = <span>array_unique</span>(<span>$urlArr</span>[0<span>]);
</span><span>$count</span> = <span>array</span><span>();
</span><span>foreach</span> (<span>$avalie</span> <span>as</span> <span>$key</span> => <span>$ul</span><span>) {
   </span><span>$pattern</span> = '/<img  src="/static/imghw/default1.png"  data-src="(http:\/\/car1\.autoimg\.cn\/upload\/\d+\/\d+\/\d+\/.*?\.jpg)"  class="lazy"/'<span alt="使用file_get_content系列函数和使用curl系列函数采集图片的性能对比,curl函数_PHP教程" >;
   </span><span>preg_match_all</span>(<span>$pattern</span>, <span>file_get_contents</span>('http://car.autohome.com.cn'.<span>$ul</span>), <span>$imgSrc</span><span>);
   </span><span>$count</span> = <span>array_merge</span>(<span>$count</span>, <span>$imgSrc</span>[1<span>]);
}


</span><span>foreach</span>(<span>$count</span> <span>as</span> <span>$k</span>=><span>$v</span><span>) {
  </span><span>$data</span>[<span>$k</span>] = <span>file_get_contents</span>(<span>$v</span><span>);
}

</span><span>foreach</span>(<span>$data</span> <span>as</span> <span>$k</span>=><span>$v</span><span>) {
  </span><span>file_put_contents</span>('./pic2/'.<span>time</span>().'_'.<span>rand</span>(1, 10000).'.jpg', <span>$v</span><span>);
}

</span><span>$runtime</span>-><span>stop();  
</span><span>echo</span> "页面执行时间: ".<span>$runtime</span>->spent()." 毫秒"; 
로그인 후 복사

  结果发现,这种方法少图片还好,图片多了,那是相当的卡。。就本地测试也比较难跑,更不如说到时候上线了。百度之后,我采用了curl的办法来下载图片,经过测试后的确有所改善,但是感觉还是有点慢,要是php有多线程那有多好。。。

  又经过一番折腾和找资料,发现php的curl库其实还是可以模拟多线程的,那就是使用curl_multi_*系列的函数,经过改写,代码又变成了这样:

  

<?<span>php
</span><span>header</span>('Content-type:text/html;charset=utf-8'<span>);
</span><span>set_time_limit</span>(0<span>);

</span><span>class</span><span> runtime  
{  
    </span><span>var</span> <span>$StartTime</span> = 0<span>;  
    </span><span>var</span> <span>$StopTime</span> = 0<span>;  
   
    </span><span>function</span><span> get_microtime()  
    {  
        </span><span>list</span>(<span>$usec</span>, <span>$sec</span>) = <span>explode</span>(' ', <span>microtime</span><span>());  
        </span><span>return</span> ((<span>float</span>)<span>$usec</span> + (<span>float</span>)<span>$sec</span><span>);  
    }  
   
    </span><span>function</span><span> start()  
    {  
        </span><span>$this</span>->StartTime = <span>$this</span>-><span>get_microtime();  
    }  
   
    </span><span>function</span><span> stop()  
    {  
        </span><span>$this</span>->StopTime = <span>$this</span>-><span>get_microtime();  
    }  
   
    </span><span>function</span><span> spent()  
    {  
        </span><span>return</span> <span>round</span>((<span>$this</span>->StopTime - <span>$this</span>->StartTime) * 1000, 1<span>);  
    }  
   
}  

</span><span>$runtime</span>= <span>new</span><span> runtime();  
</span><span>$runtime</span>-><span>start();  


</span><span>$url</span> = 'http://car.autohome.com.cn/pic/series-s15306/289.html#pvareaid=102177'<span>;
</span><span>$rs</span> = <span>file_get_contents</span>(<span>$url</span><span>);
</span><span>preg_match_all</span>('/(\/pic\/series-s15306\/289-\d+\.html)/', <span>$rs</span>, <span>$urlArr</span><span>);

</span><span>$avalie</span> = <span>array_unique</span>(<span>$urlArr</span>[0<span>]);
</span><span>$count</span> = <span>array</span><span>();
</span><span>foreach</span> (<span>$avalie</span> <span>as</span> <span>$key</span> => <span>$ul</span><span>) {
   </span><span>$pattern</span> = '/<img  src="/static/imghw/default1.png"  data-src="(http:\/\/car1\.autoimg\.cn\/upload\/\d+\/\d+\/\d+\/.*?\.jpg)"  class="lazy"/'<span alt="使用file_get_content系列函数和使用curl系列函数采集图片的性能对比,curl函数_PHP教程" >;
   </span><span>preg_match_all</span>(<span>$pattern</span>, <span>file_get_contents</span>('http://car.autohome.com.cn'.<span>$ul</span>), <span>$imgSrc</span><span>);
   </span><span>$count</span> = <span>array_merge</span>(<span>$count</span>, <span>$imgSrc</span>[1<span>]);
}

</span><span>$handle</span> =<span> curl_multi_init();

</span><span>foreach</span>(<span>$count</span> <span>as</span> <span>$k</span> => <span>$v</span><span>) {
  </span><span>$curl</span>[<span>$k</span>] = curl_init(<span>$v</span><span>);
  curl_setopt(</span><span>$curl</span>[<span>$k</span>], CURLOPT_RETURNTRANSFER, 1<span>);
  curl_setopt(</span><span>$curl</span>[<span>$k</span>], CURLOPT_HEADER, 0<span>);
  curl_setopt(</span><span>$curl</span>[<span>$k</span>], CURLOPT_TIMEOUT, 30<span>);
  curl_multi_add_handle (</span><span>$handle</span>, <span>$curl</span>[<span>$k</span><span>]);
}

</span><span>$active</span> = <span>null</span><span>;

</span><span>do</span><span> {
    </span><span>$mrc</span> = curl_multi_exec(<span>$handle</span>, <span>$active</span><span>);
} </span><span>while</span> (<span>$mrc</span> ==<span> CURLM_CALL_MULTI_PERFORM);

</span><span>while</span> (<span>$active</span> && <span>$mrc</span> ==<span> CURLM_OK) {
    // 这句在php5.3以后的版本很关键,因为没有这句,可能curl_multi_select可能会永远返回-1,这样就永远死在循环里了
    </span><span>while</span> (curl_multi_exec(<span>$handle</span>, <span>$active</span>) ===<span> CURLM_CALL_MULTI_PERFORM);

    </span><span>if</span> (curl_multi_select(<span>$handle</span>) != -1<span>) {
        </span><span>do</span><span> {
            </span><span>$mrc</span> = curl_multi_exec(<span>$handle</span>, <span>$active</span><span>);
        } </span><span>while</span> (<span>$mrc</span> ==<span> CURLM_CALL_MULTI_PERFORM);
    }
}

</span><span>foreach</span> (<span>$curl</span> <span>as</span> <span>$k</span> => <span>$v</span><span>) {
    </span><span>if</span> (curl_error(<span>$curl</span>[<span>$k</span>]) == ""<span>) {
        </span><span>$data</span>[<span>$k</span>] = curl_multi_getcontent(<span>$curl</span>[<span>$k</span><span>]);
    }
    curl_multi_remove_handle(</span><span>$handle</span>, <span>$curl</span>[<span>$k</span><span>]);
    curl_close(</span><span>$curl</span>[<span>$k</span><span>]);
}

</span><span>foreach</span>(<span>$data</span> <span>as</span> <span>$k</span>=><span>$v</span><span>) {
    </span><span>$file</span> = <span>time</span>().'_'.<span>rand</span>(1000, 9999).'.jpg'<span>;
    </span><span>file_put_contents</span>('./pic3/'.<span>$file</span>, <span>$v</span><span>); 
}

curl_multi_close(</span><span>$handle</span><span>);

</span><span>$runtime</span>-><span>stop();  
</span><span>echo</span> "页面执行时间: ".<span>$runtime</span>->spent()." 毫秒"; 
로그인 후 복사

  好了,多线程的采集真是非常酸爽,然后通过一系列的测试和对比,5次测试,curl多线程有4次是快于file_get_content的,而且时间还是file_get_content的3~5倍,总结起来,以后采集都尽量使用这种办法,提高效率不在话下。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/971771.htmlTechArticle使用file_get_content系列函数和使用curl系列函数采集图片的性能对比,curl函数 由于公司的一个汽车网站的后台的汽车内容都是主要是来自与汽...
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Xiaomi 15 시리즈 전체 코드명 공개: Dada, Haotian, Xuanyuan Xiaomi 15 시리즈 전체 코드명 공개: Dada, Haotian, Xuanyuan Aug 22, 2024 pm 06:47 PM

샤오미 Mi 15 시리즈는 10월 정식 출시될 예정이며, 전체 시리즈 코드명이 외신 MiCode 코드베이스에 노출됐다. 그중 주력 제품인 샤오미 미 15 울트라의 코드명은 '쉬안위안(Xuanyuan)'('쉬안위안(Xuanyuan)'이라는 뜻)이다. 이 이름은 중국 신화 속 황제(Yellow Emperor)에서 유래한 것으로 귀족을 상징한다. Xiaomi 15의 코드명은 "Dada"이고, Xiaomi 15Pro의 이름은 "Haotian"("Haotian"을 의미)입니다. Xiaomi Mi 15S Pro의 내부 코드명은 "dijun"으로, "산과 바다의 고전"의 창조신인 Jun 황제를 암시합니다. Xiaomi 15Ultra 시리즈 커버

다양한 Java 프레임워크의 성능 비교 다양한 Java 프레임워크의 성능 비교 Jun 05, 2024 pm 07:14 PM

다양한 Java 프레임워크의 성능 비교: REST API 요청 처리: Vert.x가 최고이며 요청 속도는 SpringBoot의 2배, Dropwizard의 3배입니다. 데이터베이스 쿼리: SpringBoot의 HibernateORM은 Vert.x 및 Dropwizard의 ORM보다 우수합니다. 캐싱 작업: Vert.x의 Hazelcast 클라이언트는 SpringBoot 및 Dropwizard의 캐싱 메커니즘보다 우수합니다. 적합한 프레임워크: 애플리케이션 요구 사항에 따라 선택하세요. Vert.x는 고성능 웹 서비스에 적합하고, SpringBoot는 데이터 집약적 애플리케이션에 적합하며, Dropwizard는 마이크로서비스 아키텍처에 적합합니다.

화웨이 메이트 60 시리즈 구매 최적기, 새로운 AI 제거 + 이미지 업그레이드, 가을 프로모션 즐기기 화웨이 메이트 60 시리즈 구매 최적기, 새로운 AI 제거 + 이미지 업그레이드, 가을 프로모션 즐기기 Aug 29, 2024 pm 03:33 PM

지난해 화웨이 메이트60 시리즈가 출시된 이후 개인적으로는 메이트60프로를 메인폰으로 사용해오고 있다. 거의 1년 동안 Huawei Mate60Pro는 여러 번의 OTA 업그레이드를 거쳤으며 전반적인 경험이 크게 개선되어 사람들에게 끊임없이 새로운 느낌을 줍니다. 예를 들어, 최근 Huawei Mate60 시리즈는 이미징 기능이 다시 한 번 크게 업그레이드되었습니다. 첫 번째는 행인과 잔해를 지능적으로 제거하고 빈 영역을 자동으로 채울 수 있는 새로운 AI 제거 기능입니다. 두 번째로 메인 카메라의 색상 정확도와 망원 선명도가 크게 업그레이드되었습니다. 개학 시즌을 고려하여 Huawei Mate60 시리즈도 가을 프로모션을 시작했습니다. 휴대폰 구매 시 최대 800위안 할인 혜택을 누릴 수 있으며, 시작 가격은 최저 4,999위안입니다. 일반적으로 사용되며 종종 가치가 높은 새로운 제품

Excel 함수 수식의 전체 모음 Excel 함수 수식의 전체 모음 May 07, 2024 pm 12:04 PM

1. SUM 함수는 열이나 셀 그룹의 숫자를 합하는 데 사용됩니다(예: =SUM(A1:J10)). 2. AVERAGE 함수는 열이나 셀 그룹에 있는 숫자의 평균을 계산하는 데 사용됩니다(예: =AVERAGE(A1:A10)). 3. COUNT 함수, 열이나 셀 그룹의 숫자나 텍스트 수를 세는 데 사용됩니다. 예: =COUNT(A1:A10) 4. IF 함수, 지정된 조건을 기반으로 논리적 판단을 내리고 결과를 반환하는 데 사용됩니다. 해당 결과.

C++에서 멀티스레드 프로그램의 성능을 최적화하는 방법은 무엇입니까? C++에서 멀티스레드 프로그램의 성능을 최적화하는 방법은 무엇입니까? Jun 05, 2024 pm 02:04 PM

C++ 다중 스레드 성능을 최적화하기 위한 효과적인 기술에는 리소스 경합을 피하기 위해 스레드 수를 제한하는 것이 포함됩니다. 경합을 줄이려면 가벼운 뮤텍스 잠금을 사용하세요. 잠금 범위를 최적화하고 대기 시간을 최소화합니다. 동시성을 향상하려면 잠금 없는 데이터 구조를 사용하세요. 바쁜 대기를 피하고 이벤트를 통해 스레드에 리소스 가용성을 알립니다.

비트겟 런치풀이란? Bitget 런치풀은 어떻게 사용하나요? 비트겟 런치풀이란? Bitget 런치풀은 어떻게 사용하나요? Jun 07, 2024 pm 12:06 PM

BitgetLaunchpool은 모든 암호화폐 애호가를 위해 설계된 동적 플랫폼입니다. BitgetLaunchpool은 독특한 제품으로 돋보입니다. 여기에서 토큰을 스테이킹하여 에어드랍, 높은 보상, 초기 참가자에게만 제공되는 넉넉한 상금 풀 등 더 많은 보상을 잠금 해제할 수 있습니다. BitgetLaunchpool이란 무엇인가요? BitgetLaunchpool은 사용자 친화적인 이용 약관에 따라 토큰을 스테이킹하고 획득할 수 있는 암호화폐 플랫폼입니다. Launchpool에 BGB 또는 기타 토큰을 투자함으로써 사용자는 무료 에어드랍, 수익을 받고 넉넉한 보너스 풀에 참여할 수 있는 기회를 갖게 됩니다. 담보자산의 수입은 T+1시간 이내에 계산되며, 보상은 다음을 기준으로 합니다.

Golang 함수가 맵 매개변수를 수신할 때 주의할 사항 Golang 함수가 맵 매개변수를 수신할 때 주의할 사항 Jun 04, 2024 am 10:31 AM

Go의 함수에 지도를 전달하면 기본적으로 복사본이 생성되며 복사본을 수정해도 원본 지도에는 영향을 미치지 않습니다. 원본 지도를 수정해야 하는 경우 포인터를 통해 전달할 수 있습니다. 빈 맵은 기술적으로 nil 포인터이기 때문에 주의해서 처리해야 하며, 비어 있지 않은 맵을 기대하는 함수에 빈 맵을 전달하면 오류가 발생합니다.

Golang의 난수 생성기 성능은 얼마나 좋나요? Golang의 난수 생성기 성능은 얼마나 좋나요? Jun 01, 2024 pm 09:15 PM

Go에서 난수를 생성하는 가장 좋은 방법은 애플리케이션에 필요한 보안 수준에 따라 다릅니다. 낮은 보안: 대부분의 애플리케이션에 적합한 의사 난수를 생성하려면 math/rand 패키지를 사용하십시오. 높은 보안성: crypto/rand 패키지를 사용하여 더 강력한 무작위성을 요구하는 애플리케이션에 적합한 암호화된 보안 무작위 바이트를 생성합니다.

See all articles