31

I'm just using a file_get_contents() to get the latest tweets from a user like this:

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

This works fine on my localhost but when I upload it to my server it throws this error:

Warning: file_get_contents(http://api.twitter.com/1/statuses/user_timeline/User.json) [function.file-get-contents]:failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request...

Not sure what might be causing it, maybe a php configuration I need to set on my server?

Thanks in advance!

2

4 Answers 4

33

You might want to try using curl to retrieve the data instead of file_get_contents. curl has better support for error handling:

// 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);

This may give you a better idea why you're receiving the error. A common error is hitting the rate limit on your server.

2
  • 1
    You should print curl_error($ch) to get a more detailed error. Commented Jun 4, 2014 at 10:29
  • question is about file_get_contents. suddenly an accepted curl answer shows up. what happened? am i missed something? Commented Mar 12 at 13:29
8

You can use file_get_contents adding the ignore_errors option set to true, in this way you will get the entire body of the response in case of error (HTTP/1.1 400, for example) and not only a simple false.

You can see an example here: https://stackoverflow.com/a/11479968/3926617

If you want access to response's headers, you can use $http_response_header after the request.

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

2

Just a little addendum on Ben's answer. According to the PHP manual the CURLOPT_URL option may be set when inizializing the cURL handle with curl_init().

// 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);
0

Add this code before file_get_contents

 stream_context_set_default( [
        'ssl' => [
            'verify_peer' => false,
            'verify_peer_name' => false,
        ],
        'http' => [
            'ignore_errors' => true,
        ]
    ]);

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.