Salvador Dali
Salvador Dali

Reputation: 222531

PHP cURL vs file_get_contents

How do these two pieces of code differ when accessing a REST API?

$result = file_get_contents('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');

and

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

They both produce the same result, judging by

print_r(json_decode($result))

Upvotes: 124

Views: 127958

Answers (4)

oguzhancerit
oguzhancerit

Reputation: 1572

I know it is an old topic but I believe this is really important. And now, there are a lot of differences more than 8 years ago. As we all know, Curl is 3rd part library.

Simple Comparison: Last version of Curl library has more than 170 different functions to be able to send proper request to APIs. There were only 70 functions 8 years ago. Fact: still under development.

That's why I wanted to put a new comment to this question.

What is file_get_contents()

file_get_contents() is a filesystem function in PHP that you can read contents from a file and make requests using GET and POST methods. You can add parameters to your request while you're using file_get_contents() function. You can see the sample below.

$data = http_build_query(
    array(
        'user_id'   => '558673',
        'user_name' => 'John Doe'
    )
);

$config = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-Type: application/x-www-form-urlencoded',
        'content' => $data
    )
);

$context = stream_context_create($config);

$result = file_get_contents('https://google.com', false, $context);

What is curl()

Curl is open source third party library. You can reach the git repo from here. This function "simulates" HTTP requests and responses. This simulation allows you handling async HTTP requests and complex data transfers. In addition, Curl is suitable for performing cross-domain based FTP request. It can be used in various apps like data crawling from a website and proxy setup.

Let's check a CURL request syntax.

$url = API_ENDPOINT."/get_movies";
        
  $curl = curl_init();
         
  $params = array(
    'category' => $category,
    'limit' => $limit,
    'start' => $start,
    'order' => $order,
    'term' => $term
  );

  $params_string = http_build_query($params);

  curl_setopt($curl, CURLOPT_URL, $url);
  curl_setopt($curl, CURLOPT_POST, TRUE);
  curl_setopt($curl, CURLOPT_POSTFIELDS, $params_string);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
  
  $data = curl_exec($curl);     
  curl_close($curl);

  echo json_decode($data,TRUE); //service returns json in this sample

Note: This is the basic sample of a curl request. You can add more parameter and options to the curl object using its functions like CURLOPT_HTTPHEADER, CURLOPT_SSL_VERIFYPEER. These kind of parameters all up to you and the service that you trying to use.

CURL vs file_get_contents()

  • CURL is able to handle complex HTML communications, but file_get_contents() is not.
  • CURL supports HTTP PUT, GET, POST but file_get_contents() supports simple HTTP GET and HTTP POST requests.
  • CURL supports caching and cookies but file_get_contents() doesn’t support caching, cookies, etc.
  • CURL is able to use HTTP, HTTPS, FTP, FTPS and more. file_get_contents() uses HTTP and HTTPS protocols for communications.
  • CURL can be used to read, update and delete files from server, but file_get_contents() only allows you to read a file.
  • CURL is more secure and faster than file_get_contents()
  • CURL is bit more complex to understand than file_get_contents().

Upvotes: 12

Ivijan Stefan Stipić
Ivijan Stefan Stipić

Reputation: 6668

This is old topic but on my last test on one my API, cURL is faster and more stable. Sometimes file_get_contents on larger request need over 5 seconds when cURL need only from 1.4 to 1.9 seconds what is double faster.

I need to add one note on this that I just send GET and recive JSON content. If you setup cURL properly, you will have a great response. Just "tell" to cURL what you need to send and what you need to recive and that's it.

On your exampe I would like to do this setup:

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

This request will return data in 0.10 second max

Upvotes: 27

Xeoncross
Xeoncross

Reputation: 57184

file_get_contents() is a simple screwdriver. Great for simple GET requests where the header, HTTP request method, timeout, cookiejar, redirects, and other important things do not matter.

fopen() with a stream context or cURL with setopt are powerdrills with every bit and option you can think of.

Upvotes: 144

vr_driver
vr_driver

Reputation: 2085

In addition to this, due to some recent website hacks we had to secure our sites more. In doing so, we discovered that file_get_contents failed to work, where curl still would work.

Not 100%, but I believe that this php.ini setting may have been blocking the file_get_contents request.

; Disable allow_url_fopen for security reasons
allow_url_fopen = 0

Either way, our code now works with curl.

Upvotes: 31

Related Questions