PHPからGETリクエストを送信する方法は?


280

単純な要件でPHPを使用することを計画しています。URLからXMLコンテンツをダウンロードする必要があり、そのURLにHTTP GETリクエストを送信する必要があります。

PHPでそれを行うにはどうすればよいですか?

回答:


378

ファイルの内容以上のものが必要でない限り、を使用できますfile_get_contents

$xml = file_get_contents("http://www.example.com/file.xml");

もっと複雑なものについては、cURLを使用します


3
クエリ文字列パラメータを使用する必要がない限り、これは正しいです。
ラプター

2
@musicfreak:一部のサーバーでは、セキュリティ設定のためにクエリ文字列が無視されることがあります。また、クロスサーバクエリは、このエラーが発生することがありますfailed to open stream: HTTP request failed!
ラプター

26
@ShivanRaptor:何を言っているのかわかりません...クエリ文字列は文字列の一部にすぎません。サーバーがそれを無視する理由はありません。当然のfile_get_contentsことながら、ブラウザーが通常送信するカスタムCookie、ヘッダー、およびその他のものを使用して要求を行うことはできないため、探している応答が得られない可能性があります。その場合は、とにかくCURLを使用したほうがよいでしょう。(しかし、それはOPの場合ではありません。)
Sasha Chedygov

1
Curlはfile_get_contentsよりもはるかに高速です。高トラフィック環境ではfile_get_contentsよりCurlを優先する
Deb

2
@Sasha -私は多くの本番環境でこれを直面しているが、あなたは今のところ、これらのリンクを見ることができる:haltiko.blogspot.com/2013/02/...またはmdb9.wordpress.com/2011/03/06/...
デブ

132

より高度なGET / POSTリクエストの場合は、CURLライブラリ(http://us3.php.net/curl)をインストールできます。

$ch = curl_init("REMOTE XML FILE URL GOES HERE"); // such as http://example.com/example.xml
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
$data = curl_exec($ch);
curl_close($ch);

10
CURLを「単純な要件」に使用する必要はまったくありませんが、+ 1は、PHPでHTTPリクエストを使用してより高度な処理を行うための最良のソリューションであるためです。
xyz

すでに述べたように、curlはよりもはるかに高速ですfile_get_contents()。単純な4文字の文字列の場合は約10秒かかりましたが、カールの場合は最大で1秒ほどかかりました。
Peter Gordon

@pgmannはその結果で本当によろしいですか?これは、引用されているものの他の統計と一致していません。実際、CURLの方が高速ですが、それほど高速ではありません。この応答時間の低下は、サーバー側のリソースのキャッシングなどによるものでしょうか?たぶんあなたはテストを繰り返すべきですか?
Rauni Lillemets、2015

1
@Rauni再テストできないのではないかと思いますが、速度の向上などのために常にcURLを使用しています。リクエスト時間は概算であり、ページをロードしたときの感じです。私は何度も試しました。
Peter Gordon、

63

http_getトリックを行う必要があります。http_get以上の利点にfile_get_contentsは、HTTPヘッダーの表示、リクエストの詳細へのアクセス、接続タイムアウトの制御などがあります。

$response = http_get("http://www.example.com/file.xml");

83
http拡張はPHPにバンドルされておらず、多くの場合、共有ホストでは使用できません。
イムラン

27
これにはpecl_http> = 0.1.0が必要で、デフォルトではインストールされません。
ラプター

5
「お探しのマニュアルページ(us2.php.net/manual/en/function.http-get.php)は、現在このサーバーではご利用いただけません。」
パン

20

プロキシを使用している場合は、phpコードで少しトリックを行う必要があることに注意してください。

(PROXY WITHOUT AUTENTICATION EXAMPLE)

<?php
$aContext = array(
    'http' => array(
        'proxy' => 'proxy:8080',
        'request_fulluri' => true,
    ),
);
$cxContext = stream_context_create($aContext);

$sFile = file_get_contents("http://www.google.com", False, $cxContext);

echo $sFile;
?>

9

PHP設定でURLのfopenが許可されているかどうかに応じて、文字列にget引数(http://example.com?variable=valueなど)を使用してURLを単純にfopenすることもできます

編集:私はあなたが変数を渡すために探したりしていないかどうかかどうか分からない質問の再読み込み-あなたがいないのであればあなたは、単にfopenを要求containg送ることができhttp://example.com/filename.xmlを -気軽variable = valueの部分を無視するには



5

一方、他のサーバーのREST APIを使用することは、PHPで非常に人気があります。一部のHTTPリクエストを他のサーバーにリダイレクトする方法(たとえば、xmlファイルを取得する)を探しているとします。ここにあなたを助けるためのPHPパッケージがあります:

https://github.com/romanpitak/PHP-REST-Client

したがって、xmlファイルを取得します。

$client = new Client('http://example.com');
$request = $client->newRequest('/filename.xml');
$response = $request->getResponse();
echo $response->getParsedResponse();

5

Guzzleは非常によく知られたライブラリで、あらゆる種類のHTTP呼び出しを非常に簡単に実行できます。https://github.com/guzzle/guzzleを参照してください。でインストールしcomposer require guzzlehttp/guzzleて実行しcomposer installます。これで、http get呼び出しには次のコードで十分です。

$client = new \GuzzleHttp\Client();
$response = $client->get('https://example.com/path/to/resource');

echo $response->getStatusCode();
echo $response->getBody();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.