PHP cURLとfile_get_contents


111

REST APIにアクセスする場合、これらの2つのコードはどのように異なりますか?

$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
cURLは、をはるかに超える能力を備えていますfile_get_contents。それで十分でしょう。

18
FWIW速度に関してはほとんど違いがありません。5,000個のURLを取得し、それらのHTMLをファイルに保存しました(ファイルあたり約200k)。実験として半分をcurlで、もう半分をfile_get_contentsで行いましたが、識別できる違いはありませんでした。
David Gilbertson 2013年

8
ストリームコンテキストをサポートするバージョンを使用している限り、file_get_contentsを使用して投稿データを送信できます。
Chris Strickland

回答:


129

file_get_contents()シンプルなドライバーです。ヘッダー、HTTPリクエストメソッド、タイムアウト、cookiejar、リダイレクト、その他の重要な事柄が問題にならない単純なGETリクエストに最適です。

fopen()ストリームコンテキストを持つまたはcURLのSETOPTすべてのビットとあなたが考えることができるオプション付きpowerdrillsです。


17
その比喩の範囲内に留まるために、cURLは複雑なドリルチャックを備えたパワードリルであり、実際に変更するにはかなりの知識が必要であることに注意してください(cURLオプションの設定は少し面倒ですが、やりたいことは何でもできます)。
突く

20
file_get_contentsまた、コンテキストを設定できます。つまり、ヘッダーフィールドを自由に設定できます。
velop

4
そして、の@ velopさんのコメントに加えて、ストリームコンテキストによってはPOST、PUT、認証、ヘッダー、コンテンツ、プロキシ、およびはるか1つのfile_get_contentsを要求して送信することも可能である
マルクス・ケーラー

@velop:はい。そしてメソッドも。そしてリダイレクトします。そしてタイムアウト... php.net/manual/en/context.http.php
Sz。

25

これに加えて、最近のいくつかのウェブサイトのハッキングにより、サイトをより安全にする必要がありました。その際、curlが引き続き機能するfile_get_contentsが機能しないことがわかりました。

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があります。
コスタ

2
はい、file_get_contents()この機能を使用することが知られている多くのエクスプロイトにより、多くのホスティング会社が無効にしています。cURLは、人々が現在コードで使用する必要がある関数です。
frustratedtech

15
@frustratedtechこれらはどのような「エクスプロイト」ですか?
rdlowrey、2014年

3
ホスティング会社allow_url_fopenは、それを誤解しているため、無効にしていallow_url_includeます。使用しても問題allow_url_fopenありfile_get_contentsません。
fritzmg

2
@vr_driverそれらのリンクは何の関係もありませんfile_get_contents()
rdlowrey

19

これは古いトピックですが、私の1つのAPIでの最後のテストでは、cURLの方が高速で安定しています。より大きなリクエストでfile_get_contentsが5秒以上必要な場合がありますが、cURLは1.4から1.9秒しか必要なく、2倍高速です。

GETを送信してJSONコンテンツを受信するだけであるということについて、1つのメモを追加する必要があります。cURLを適切に設定すれば、素晴らしい反応が得られます。送信する必要のあるものと受信する必要のあるものを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マイクロ秒(MILI秒の1 / 1,000)...信じられないほどです。
マークトムリン2016年

はい。Twilio APIの電話番号チェックなど、0.02ミリ秒以内に応答があります。速いです。
Ivijan StefanStipić16年

4
0.02ms = 20マイクロ秒。あなたは0.1マイクロ秒と言ったが、これは正しくない。
Walf、2016年

2
これはfile_get_contents 、確認のためにいくつかのAPI呼び出しを行ったときの2倍の速度です。(3 API呼び出し)の0.8秒file_get_contents&0.49秒curl
Jsp

1
独自の設定を使用する必要があります。その後、クエリは1.4〜1.9秒から0.01秒に進みます;)
Rauli Rajande
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.