PHP cURL vs file_get_contents


PHP cURL vs file_get_contents

这两段代码在访问 REST API 时有何不同?

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

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

它们都产生相同的结果,从

print_r(json_decode($result))
file_get_contents()

一把简单的螺丝刀。非常适合简单的 GET 请求,其中标头、HTTP 请求方法、超时、cookiejar、重定向和其他重要内容无关紧要。

具有流上下文的fopen()或带有setopt的cURL是具有您能想到的所有位和选项的动力钻。

除此之外,由于最近的一些网站黑客攻击,我们不得不更多地保护我们的网站。在这样做的过程中,我们发现file_get_contents不起作用,而 curl 仍然可以工作。

不是 100%,但我相信这个 php.ini 设置可能已经阻止了file_get_contents请求。

; Disable allow_url_fopen for security reasons
allow_url_fopen = 0

无论哪种方式,我们的代码现在都可以使用 curl

这是一个古老的话题,但在我最后一次测试我的一个 API 时,cURL 更快、更稳定。有时file_get_contents较大的请求需要超过 5 秒,而 cURL 只需要 1.4 到 1.9 秒,速度快了一倍。

我需要在此添加一条注释,我只是发送 GET 并接收 JSON 内容。如果您正确设置cURL,您将获得很好的响应。只需"告诉"cURL 您需要发送的内容以及您需要接收的内容,仅此而已。

在您的考试中,我想进行此设置:

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

此请求最多返回 0.10 秒的数据

我知道

这是一个古老的话题,但我相信这真的很重要。而现在,与 8 年前有很多不同之处。众所周知,Curl是第三部分库。

简单比较:最新版本的 Curl 库有 170 多种不同的函数,能够向 API 发送适当的请求。那里8年前只有70个功能。事实:仍在开发中。

这就是为什么我想对这个问题发表新的评论。

什么是file_get_contents()

file_get_contents() 是 PHP 中的一个文件系统函数,您可以从文件中读取内容并使用 GET 和 POST 方法发出请求。您可以在使用 file_get_contents() 函数时向请求添加参数。您可以在下面看到示例。

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

什么是 curl()

Curl是开源的第三方库。您可以从此处访问 git 存储库。此函数"模拟"HTTP 请求和响应。此模拟允许您处理异步 HTTP 请求和复杂的数据传输。此外,Curl适用于执行基于跨域的FTP请求。它可以用于各种应用程序,例如从网站爬取数据和代理设置。

让我们检查一下 CURL 请求语法。

$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

注意:这是 curl 请求的基本示例。您可以使用 curl 对象(如 CURLOPT_HTTPHEADER、CURLOPT_SSL_VERIFYPEER)向 curl 对象添加更多参数和选项。这些参数完全取决于您和您尝试使用的服务。

卷曲 vs file_get_contents()

  • CURL能够处理复杂的HTML通信,但是 file_get_contents()不是。
  • CURL支持HTTP PUT,GET,POST,但是 file_get_contents()支持简单的HTTP GET和HTTP POST请求。
  • CURL支持缓存和 cookie,但 file_get_contents()不支持缓存、cookie 等。
  • CURL能够使用HTTP,HTTPS,FTP,FTPS等。 file_get_contents()使用 HTTP 和 HTTPS 协议通信。
  • CURL可用于读取,更新和删除文件从服务器,但file_get_contents()只允许您读取文件。
  • CURLfile_get_contents()更安全、更快捷
  • CURLfile_get_contents()更难理解。