안녕하세요 워누입니다!
오늘은 제가 회사에서 개발하다가 궁금한 점이 부딪혀서 직접 알아본 내용을 포스팅하고자 합니다.
.
상황은 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를 사용하시는 개발자라면 두 가지 방식 다 알아둔다면 적재적소에 써먹을 수 있을 것 같네요 ㅎㅎ
도움이 필요하신 분들이 이 글을 읽어서 도움이 되기를 바라며 오늘 포스팅은 여기서 마치겠습니다!
긴 글 읽어주셔서 감사합니다!
'PHP' 카테고리의 다른 글
[PHP] 시간 표시하기 (date) (0) | 2021.01.18 |
---|---|
[PHP] 폴더 생성하고 삭제하기 (mkdir, rmdir) (0) | 2020.12.06 |
[PHP] 메모장 파일 읽기! (fread, fgets) (0) | 2020.09.03 |
PHP로 txt파일에 아무 내용이나 작성해보았습니다! (0) | 2020.09.02 |
PHP 8 출시..? 어떤 것이 달라질까? (1) | 2020.09.01 |