안녕하세요 워누입니다! 

오늘은 제가 회사에서 개발하다가 궁금한 점이 부딪혀서 직접 알아본 내용을 포스팅하고자 합니다. 

.

상황은 API 호출 시 특정 URL로 form-data를 post로 던지고 그 결과를 받아오는 로직입니다!

 

1. file_get_contents

//Post api call
function reqPost($data, $url){
	$requestData = stream_context_create(array(
		'http' => array(
			'method' => 'POST',
			'header' => 'Content-type:application/x-www-form-urlencoded;charset=euc-kr',
			'content' => $data,
			'timeout' => 15
		)
	));
	
	$response = file_get_contents($url, FALSE, $requestData);
	return $response;
}

 

2. curl

//Post api call
function reqPost(Array $data, $url){
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);	//connection timeout 15 
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));	//POST data
	curl_setopt($ch, CURLOPT_POST, true);
	$response = curl_exec($ch);
	curl_close($ch);	 
	return $response;
}

API를 호출하는 방식의 차이이고, 제가 적용한 소스에서 두 방식 모두 결과는 같습니다!

 

그렇다면 대체 뭐가 다른지 알아야 다른 모듈을 개발하면서 API를 호출할 때,

file_get_contents()를 쓸지, curl을 쓸지 쉽게 결정하겠죠? 

 

일단 file_get_contents()과 curl은 함수/라이브러리라는 개념적인 차이점이 있습니다. 

표로 아래와 같이 정리해볼 수 있겠습니다. 

명칭 구분 설명
file_get_contents() 함수 전체 파일을 문자열로 읽어오는 함수. php 4.3부터 7.x버전까지 사용 가능

*매개변수 ($filename, [$use_include_path, $context, $offset, $maxlen])
[] : 옵션 매개변수
$filename : 읽어올 파일명 or URL
$use_include_path : 파일 내 참조된 내용까지 읽어올지 여부 결정. 
$context : stream_context_create()로 작성된 유효한 컨텍스트 리소스. 
$offset : 몇 번째 데이터부터 읽을건지 설정.
$maxlen : 얼만큼 데이터를 읽을건지 length(길이)를 설정.
curl 라이브러리 다양한 프로토콜을 이용하여 데이터를 주고받는 기능 제공.
http, https, ftp, gopher, telnet, dict, file, ldap 등의 프로토콜 지원.

*함수
curl_init : curl 초기화 
curl_setopt : curl 데이터 옵션 설정 
 <예시>
 CURLOPT_URL : 통신할 URL 설정
 CURLOPT_RETURNTRANSFER : 요청 결과를 문자열로 반환 
 CURLOPT_CONNECTTIMEOUT : 요청 시 최대 Connection timeout 설정
 CURLOPT_SSL_VERIFYPEER : 원격 서버의 인증서가 유효한지 체크
 ...
curl_exec($ch) : curl_setopt를 통해 설정된 $ch에 대하여 통신을 실행하는 함수.
curl_close($ch) : curl $ch 종료함수.

이렇게 보니까 차이가 좀 크네요! 확실히 curl이 좀더 복잡해보입니다.

만약 두개가 서로 차이점이 없다면, 굳이 복잡한 curl을 쓸 필요가 없겠지만

php 개발자들이 가급적 curl을 선호하는 이유가 있습니다! 검색해서 찾아보고 정리해보았습니다.

 

1. file_get_contents()를 사용할 경우, 로그인이 필요하지 않은 페이지의 URL만 확인 가능하며, 읽어올 대상 페이지의 서버 혹은 소스에 allow_url_fopen 옵션이 활성화되어 있어야 합니다. 

그러나 이마저도, 최근에 allow_url_fopen 옵션에 대하여 보안문제가 이슈가 되어 php 개발자들이 해당 기능을 잘 사용하지 않는다고 하니 file_get_contents()를 사용하기가 점점 어려워 지고 있습니다.

 

2. curl_setopt를 통해 사용할 수 있는 설정들이 다양합니다. 범위가 함수냐, 라이브러리냐의 차이이기 때문에 간단한 기능이라면, file_get_contents()를 쓰겠지만 다양한 기능을 쓴다면 당연히 curl로 처리하는게 더 좋겠죠?

 

3. 같은 옵션, 같은 함수를 반복적으로 호출할 시 속도면에서 약 15~30%정도 차이가 나는 것을 확인하였습니다.

이거는 제가 체험해봐서 아는 거라 자세히 설명하기가 어렵네요..ㅜ 직접 소스를 돌려보고 차이를 느껴보셔야 합니다...!!

 

위와 같은 이슈로 요즈음의 php 개발자들은 데이터를 읽어오고 통신하는 부분에서는 curl을 더 선호한다고 합니다! 

그래도 단순 파일 읽어오기 혹은 보안 이슈가 필요없는 URL 호출을 사용한다면 file_get_contents()를 이용해서 데이터를 읽어와도 될 것 같습니다. 

 

PHP를 사용하시는 개발자라면 두 가지 방식 다 알아둔다면 적재적소에 써먹을 수 있을 것 같네요 ㅎㅎ

도움이 필요하신 분들이 이 글을 읽어서 도움이 되기를 바라며 오늘 포스팅은 여기서 마치겠습니다! 

 

긴 글 읽어주셔서 감사합니다!

 

 

 

+ Recent posts