私は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設定ですか?
前もって感謝します!
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);
これにより、エラーが発生する理由がわかります。一般的なエラーは、サーバーのレート制限に達しています。
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
ベンの答えのほんの少しの補遺。 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);