본문 바로가기
WEB/Etc

[PHP] CURL 홈페이지 파싱, 멀티

by 얼빵이 2020. 9. 29.
반응형

 

홈페이지 파싱에 관한 이야기를 해보려한다.

사내 유지보수용 사이트를 구축중인데 파싱할일이 상당히 많다.

단일 홈페이지 파싱을 할땐 Curl을 아래와 같이 사용했다

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
function GetData($Protocol,$Domain,$Data){
    $Curl = curl_init();
    curl_setopt ($Curl, CURLOPT_URL,$Protocol."://".$Domain); // 파싱할 Url 주소이다
    curl_setopt ($Curl, CURLOPT_SSL_VERIFYPEER, FALSE); 
    curl_setopt($Curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)'); // 서버에 보여줄 UserAgent 정보이다
    curl_setopt ($Curl, CURLOPT_SSLVERSION,4); // SSL 버전
    curl_setopt ($Curl, CURLOPT_HEADER, 0); 
    curl_setopt ($Curl, CURLOPT_POST, 1); // 값을 넘겨줄지
    curl_setopt ($Curl, CURLOPT_POSTFIELDS, "".$Data.""); // Get방식처럼 데이터를 넘겨준다 
    curl_setopt ($Curl, CURLOPT_TIMEOUT, 30); 
    curl_setopt ($Curl, CURLOPT_RETURNTRANSFER, 1); 
    $result = curl_exec ($Curl);
    return $result;
}
?>
cs

 

그런데 여러 홈페이지를 파싱하다보니 속도가 너무 느린게 흠이였다

그래서 구글링으로 찾아본 결과

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
function multi_url( $urls$timeout = 3 ){
        $mh = curl_multi_init();
        $conn = array();
        foreach( $urls as $i => $url) {
            $conn[$i= curl_init( $url );
            curl_setopt( $conn[$i], CURLOPT_RETURNTRANSFER, true);
            curl_setopt( $conn[$i], CURLOPT_SSL_VERIFYPEER, false );
            curl_setopt( $conn[$i], CURLOPT_SSL_VERIFYHOST, false );
            curl_setopt( $conn[$i], CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)');
            curl_setopt ( $conn[$i], CURLOPT_SSLVERSION,4); 
 
            if ( $timeout ){
              curl_setopt( $conn[$i], CURLOPT_TIMEOUT, $timeout );
            }
            curl_multi_add_handle( $mh$conn[$i] );
        }
        $health = null;
 
        do {
            usleep( 10000 );
            $mrc = curl_multi_exec( $mh$health );
        } while$health > 0 );
        $res = array();
        foreach( $urls as $i => $url ){
            $res[] = curl_multi_getcontent( $conn[$i] );
            curl_multi_remove_handle( $mh$conn[$i] );
        }
        
        curl_multi_close($mh);
        return $res;
}
?>
cs

 

해당 소스로 적용결과 적은건에서는 큰 차이는 없으나

약 100개의 사이트를 파싱하는 속도는 엄청난 차이를 가져왔다

100개의 사이트를 파싱하는데 약 15초정도 소요가 되는것으로 보인다

행-복!

반응형

'WEB > Etc' 카테고리의 다른 글

[vue.js] <li> v-for 에러  (0) 2021.11.01
[PHP] PHP7 mcrypt_encrypt, openssl_encrypt  (0) 2020.10.22
[PHP] 로그인 페이지를 만들어보자 (DB사용)  (0) 2020.10.08

댓글


TOP

TEL. 02.1234.5678 / 경기 성남시 분당구 판교역로