Backends PHP

PHP 스크립트에서의 HTTP 통신 #1 – cURL 라이브러리

cURL 소개

PHP 상에서 URL을 가지고 HTTP 통신을 해야 하는 경우가 있습니다. 이를테면 타 이미지 호스팅 서버의 이미지를 가져와야 한다던가, 블로그의 RSS를 가져와서 최근 글을 추려내야 한다던가, XML 포멧으로 반환되는 API와 통신해야 한다던가, 어느 페이지에 값을 보내야 한다던가, 적용할 수 있는 상황은 무척 많습니다.

방법은 여러 가지가 있는데, 그 중에 간단하고도 널리 사용되는 방법은 바로 cURL 라이브러리를 이용하는 것입니다. cURL은 라이브러리 제작자 Daniel Stenberg이 command line과 URL을 합성하여 만든 이름인데, 이름 그대로 본래는 커맨드라인 상에서 URL을 통해 통신할 때에 사용하는 라이브러리입니다.

http://www.php.net/manual/en/book.curl.php

18개의 함수로 구성된 그 자체만으로도 심플한 라이브러리이지만, 간단한 HTTP 통신을 위해 사용할 때는 4개의 함수만 기억해도 무방합니다. 먼저 curl_init 함수를 이용해 cURL 세션을 생성하고, curl_setopt 함수를 이용해 각종 옵션을 정하고, curl_exec 함수로 실제 HTTP 통신을 하며, curl_close로 cURL 세션을 닫으면 됩니다.

이 중에서 특별히 눈여겨 봐두어야 하는 함수는 curl_setopt로, 수십 가지의 옵션들을 통해 사용폭을 넓혀주고 있습니다. 이를테면 CURLOPT_HEADER가 true면 HTTP response header를 같이 반환받을 수 있고, 쿠키와 같은 HTTP reqeust header 값도 이 함수로 추가할 수 있습니다. 이 전천후 curl_setopt 함수 덕분에 cURL로 작성한 코드는 무척 간결하고 해독하기 쉽습니다.

 

cURL로 작성된 HTTP 통신 함수

아래는 위의 4개 함수만으로 작성하여 본 간단한 HTTP 통신 함수입니다. 함수에서 잘 나타나듯 curl_init로 시작하여, curl_exec과 curl_close로 끝나고, 그 사이에 curl_setopt로 경우에 따라 다양한 옵션을 세팅하는 것이 curl의 기본적인 사용법입니다.

function getFromUrl($url, $method = 'GET')
{
	$ch = curl_init();
	$agent = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0)';

	switch(strtoupper($method))
	{
		case 'GET':		
			curl_setopt($ch, CURLOPT_URL, $url);
			break;

		case 'POST':
			$info = parse_url($url);
			$url = $info['scheme'] . '://' . $info['host'] . $info['path'];
			curl_setopt($ch, CURLOPT_URL, $url);
			curl_setopt($ch, CURLOPT_POST, true);
			curl_setopt($ch, CURLOPT_POSTFIELDS, $info['query']);
			break;

		default:
			return false;
	}

	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
	curl_setopt($ch, CURLOPT_TIMEOUT, 5);
	curl_setopt($ch, CURLOPT_HEADER, false);
	curl_setopt($ch, CURLOPT_REFERER, $url);
	curl_setopt($ch, CURLOPT_USERAGENT, $agent);
	$res = curl_exec($ch);
	curl_close($ch);

	return $res;
}

첫 번째 파라메터 $url에는 웹브라우저 주소창에 타이핑하듯이 URL을 하나의 문자열로 입력받도록 하였습니다. 사용상의 간편함을 위해 POST 메소드를 이용할 때에도 ? 뒤에 쿼리를 입력하면 함수 내부의 switch문 안에서 처리하도록 구성하였습니다.

두 번째 파라메터 $method에는 물론 메소드를 입력받습니다. 대소문자 구분없이 GET과 POST 중 하나를 입력받습니다.

cURL로 접속한 결과가 정상인 경우, 함수는 HTTP Response Body를 반환합니다. 그러나 메소드가 GET과 POST 외의 것이거나, cURL로 접속에 실패한 경우에는 false를 반환합니다.

그 외에 서버설정에 따라 User Agent가 없거나 Http Referer가 외부 도메인인 경우에 응답이 정상적으로 이루어지지 않는 경우를 대비하여, User Agent는 강제로 Internet Explorer 9으로 지정하고, Referer 역시 입력한 URL이 자동으로 들어가도록 장치를 해놓았습니다.

이 함수는 HTTPS 등 몇가지 상황에 대해서는 테스트되지 않았지만, 세세한 세팅이 필요하지 않은 간단한 HTTP 통신에 있어서는 간편하고 이용할 수 있습니다.

 

사용례: URL로부터 RSS 가져오기

저는 위 함수를 제 홈페이지에서 이웃들의 RSS를 하나씩 가져와 최신글을 추려낼 때에 사용하고 있습니다. simplexml_load_string과 결합하면 간단하게 RSS 구조를 파싱할 수 있고, 여기에 HTML과 CSS를 예쁘게 입히면 메타사이트 역시 손쉽게 구축할 수 있습니다.

$url = 'http://www.sangron.com/untitled/rss';
$rss = simplexml_load_string(getFromUrl($url, 'GET'));

foreach ($rss->channel->item as $post)
{
	print_r($post->title);
	print_r($post->description);
}

 

1 thought on “PHP 스크립트에서의 HTTP 통신 #1 – cURL 라이브러리”

  1. 실 용례에서 사용할 수 있는 example이 필요했는데 도움 받고 갑니다 🙂

Leave a Reply to 박종일 Cancel reply

Your email address will not be published. Required fields are marked *