PHP) cURL Async (PHP5+)

카테고리 : 웹 프로그래밍/PHP

PHP5이상에서는 curl_multi_init 함수를 이용 가능하다.

 

curl_multi_init 함수를 이용하여 비동기 처리를 해보려 한다.

 

아래와 같이 코드를 작성하면 url변수에 담긴 주소들에 비동기 방식으로 접근 가능하다.

<?php

$url=[]; //배열 선언

$url[]='http://example.com';
/*
	주소 배열에 접속할 주소 입력
    
    예) http://127.0.0.1/my_api?param1=abc&param2=1234
	
    ...
    
*/


$mh = curl_multi_init();
foreach($url as $key => $value){
	$ch[$key] = curl_init($value);
	curl_setopt($ch[$key], CURLOPT_NOBODY, true);//만약 데이터를 받을필요가 없는경우
	curl_setopt($ch[$key], CURLOPT_HEADER, true);//만약 헤더만 필요한경우
	curl_setopt($ch[$key], CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch[$key], CURLOPT_SSL_VERIFYPEER, false);//ssl 필요가 없는경우
	curl_setopt($ch[$key], CURLOPT_SSL_VERIFYHOST, false);//ssl 필요가 없는경우

	curl_multi_add_handle($mh,$ch[$key]);
}

do {
	curl_multi_exec($mh, $running);
	curl_multi_select($mh);
} while ($running > 0);

foreach(array_keys($ch) as $key){
	echo curl_getinfo($ch[$key], CURLINFO_HTTP_CODE).' '.curl_getinfo($ch[$key], CURLINFO_EFFECTIVE_URL).PHP_EOL;
	//$response = curl_multi_getcontent($ch[$key]); //결과를 파싱하려면 필요, 위의 CURLOPT_NOBODY를 제거해야됨
	curl_multi_remove_handle($mh, $ch[$key]);//remove_handle 은 필수입니다.
}

curl_multi_close($mh);
?>

do while 하단의 foreach를 이용하여 정상적으로 처리되었나를 처리하여

 

DB에 commit, rollback을 선택하는 등의 코드 작성 또한 가능하다.

 

만약에 동기 형태의 코드로 curl을 작성했다면 한 번에 하나의 url처리를 하게 되므로

10개의 처리과정은 다음과 같이 된다.

1 2 3 4 5 6 7 8 9 10

1번 실행 -> 1번 완료 -> 2번 실행 -> 2번 완료 반복...

 

완료 시까지 아무 일도 안 하고 대기를 하게 된다.

CPU 성능은 남아도는데 네트워크 처리속도가 가로막게 된다.

 

그러나 비동기로 처리 시 1번 실행 시 10번까지 실행을 하고 처리된 대로 완료 신호를 따로 받는다.

while문이 실행 중이기 때문에 해당 코드에서는 모두 완료되면 while 탈출하여 완료 처리 과정을 진행할 수 있다.

 

만약 CPU가 성능이 10개는 한 번에 처리할 능력이 된다면

비동기로 실행한 경우가 동기로 실행한 경우보다 10배 빠르게 된다.

1개 완료가 되어야 다음 것을 실행한다면 같은 시간에 10개도 처리가 가능한데 기다리고 있으므로 10개를 모두 실행해 완료한 시간과 동일하게

1~10

한 번에 끝~

 

저작권 보호안내
무단 전재, 재배포 행위는 금지됩니다. (글을 복사하여 게시금지)
본문의 일부(링크용 문장) 인용은 가능하지만, 출처와 링크(a 태그)를 남기셔야 됩니다.
(웹툴을 이용하고, 스크린샷/녹화하는것은 상관없습니다.)

예외적으로. 저에게 허락받은 경우에는 본문을 전재할 수 있습니다.

만약, 본문 공유를 원하신다면 링크 공유를 해주세요

저작권 정책 확인하기
링크 공유하기

 댓글