web-dev-qa-db-ja.com

file_get_contentsは400 Bad RequestエラーをスローしますPHP

私はfile_get_contents()を使用して、次のようにユーザーから最新のツイートを取得しています:

$Tweet = json_decode(file_get_contents('http://api.Twitter.com/1/statuses/user_timeline/User.json'));

これは私のローカルホストでは正常に動作しますが、サーバーにアップロードすると、次のエラーがスローされます。

警告:file_get_contents( http://api.Twitter.com/1/statuses/user_timeline/User.json )[ function.file-get-contents]:ストリームを開けませんでした:HTTPリクエストが失敗しました! HTTP/1.0 400不正なリクエスト...

何が原因かわからない、おそらく私のサーバーで設定する必要があるphp設定ですか?

前もって感謝します!

27

File_get_contentsの代わりにcurlを使用してデータを取得してみてください。 curlはエラー処理をよりよくサポートしています:

// make request
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://api.Twitter.com/1/statuses/user_timeline/User.json"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$output = curl_exec($ch);   

// convert response
$output = json_decode($output);

// handle error; error output
if(curl_getinfo($ch, CURLINFO_HTTP_CODE) !== 200) {

  var_dump($output);
}

curl_close($ch);

これにより、エラーが発生する理由がわかります。一般的なエラーは、サーバーのレート制限に達しています。

26
Ben Rowe

file_get_contentsを使用してignore_errorsオプションをtrueに設定すると、エラーが発生した場合に応答の本文全体を取得できます(たとえば、HTTP/1.1 400)。単純なfalseだけではありません。

ここで例を見ることができます: https://stackoverflow.com/a/11479968/3926617

応答のヘッダーにアクセスする場合は、リクエストの後に$http_response_headerを使用できます。

http://php.net/manual/en/reserved.variables.httpresponseheader.php

3
Wandeber

ベンの答えのほんの少しの補遺。 PHPマニュアル によると、curl_init()でcURLハンドルを初期化するときにCURLOPT_URLオプションが設定される場合があります。

// make request
$ch = curl_init("http://api.Twitter.com/1/statuses/user_timeline/User.json");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$output = curl_exec($ch);   

// convert response
$output = json_decode($output);

// handle error; error output
if(curl_getinfo($ch, CURLINFO_HTTP_CODE) !== 200) {

  var_dump($output);
}

curl_close($ch);
1
bytepan