PHP cURL 대 file_get_contents


111

REST API에 액세스 할 때이 두 코드가 어떻게 다른가요?

$result = file_get_contents('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');

$ch = curl_init('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);

둘 다 동일한 결과를 산출합니다.

print_r(json_decode($result))

2
cURLfile_get_contents. 충분합니다.

18
FWIW 속도와 관련하여 약간의 차이가 있습니다. 5,000 개의 URL을 가져오고 HTML을 파일에 저장했습니다 (파일 당 약 200k). 절반은 curl로, 절반은 file_get_contents로 실험했는데 눈에 띄는 차이가 없었습니다.
David Gilbertson

8
스트림 컨텍스트를 지원하는 버전을 사용하는 한 file_get_contents로 게시 데이터를 보낼 수 있습니다.
Chris Strickland 2014

답변:


129

file_get_contents()간단한 드라이버입니다. 헤더, HTTP 요청 방법, 시간 초과, cookiejar, 리디렉션 및 기타 중요한 사항이 중요하지 않은 간단한 GET 요청에 적합합니다.

fopen()로모그래퍼 스트림 컨텍스트 또는 컬 SETOPT 모든 비트와 당신이 생각할 수있는 옵션을 powerdrills이다.


17
그 은유를 유지하기 위해 cURL은 복잡한 드릴 척이있는 파워 드릴이라는 점에 유의하십시오. 실제로 변경하려면 꽤 잘 알아야합니다 (읽기 : cURL 옵션 설정은 약간 지루하지만 원하는 모든 작업을 수행 할 수 있음).
찌를

20
file_get_contents컨텍스트를 설정할 수도 있습니다. 즉, 원하는대로 헤더 필드를 설정할 수 있습니다.
velop

4
와 @의 velop의 코멘트에 추가로, 스트림 문맥을 통해이 POST, PUT, 인증, 헤더, 내용, 프록시, 그리고 훨씬 더 하나 file_get_contents 요청으로 전송하는 것도 가능합니다
마커스 쾰러

@velop : 네. 그리고 방법도. 그리고 리디렉션합니다. 시간 초과 ... php.net/manual/en/context.http.php
Sz.

25

또한 최근 웹 사이트 해킹으로 인해 사이트를 더욱 안전하게 보호해야했습니다. 그렇게하면서 file_get_contents 가 작동하지 않고 curl이 여전히 작동 함을 발견 했습니다 .

100 %는 아니지만이 php.ini 설정이 file_get_contents 요청을 차단했을 수 있다고 생각합니다 .

; Disable allow_url_fopen for security reasons
allow_url_fopen = 0

어느 쪽이든, 우리 코드는 이제 curl 과 함께 작동합니다 .


9
예, 진실 file_get_contents해야 allow_url_fopen합니다.
Costa

2
예, 많은 호스팅 회사가 file_get_contents()기능을 사용하는 것으로 알려진 많은 악용으로 인해 비활성화 되고 있습니다. cURL은 사람들이 지금 코드에서 사용해야하는 기능입니다.
frustratedtech

15
@frustratedtech 이것들은 어떤 "폭발"입니까?
rdlowrey

3
호스팅 회사 allow_url_fopenallow_url_include. allow_url_fopenfile_get_contents사용에 괜찮습니다.
fritzmg

2
그 링크와는 아무 상관이 없다 @vr_driverfile_get_contents()
rdlowrey

19

이것은 오래된 주제이지만 API에 대한 마지막 테스트에서 cURL이 더 빠르고 안정적입니다. 더 큰 요청에 대한 file_get_contents는 cURL이 1.4 ~ 1.9 초만 필요한 경우 5 초 이상 필요한 경우가 있습니다.

여기에 GET을 보내고 JSON 콘텐츠를 수신한다는 메모를 하나 추가해야합니다. cURL을 올바르게 설정하면 좋은 반응을 얻을 수 있습니다. 당신이 보내야 할 것과 받기 위해 필요한 것을 컬링하기 위해 "말"하기 만하면됩니다.

귀하의 시험에서이 설정을 수행하고 싶습니다.

$ch =  curl_init('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ch, CURLOPT_TIMEOUT, 3);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));
$result = curl_exec($ch);

이 요청은 최대 0.01 초 내에 데이터를 반환합니다.


1
0.1 MICROseconds (1 / 1,000 MILIseconds) ... 믿기 어렵습니다.
Mark Tomlin 2016 년

예. 예를 들어 Twilio API 전화 번호 확인과 같이 0.02ms의 응답이 있습니다. 빠르다.
Ivijan Stefan Stipić

4
0.02ms = 20 마이크로 초; 0.1 마이크로 초라고 말했는데 옳지 않습니다.
Walf nov.

2
이것은 file_get_contents 확인을 위해 방금 API 호출을 한 것 보다 거의 두 배 빠릅니다 . 0.8 초 (3 번 API 호출)에 file_get_contents대해 0.49 초curl
Jsp 2018 년

1
자체 설정을 사용해야합니다. 그러면 쿼리가 1.4-1.9s에서 0.01s로 변경됩니다.)
Rauli Rajande
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.