PHP cURL vs file_get_content

当访问 RESTAPI 时,这两段代码有什么不同?

$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))
119238 次浏览

file_get_contents()是一个简单的螺丝刀。对于标头、 HTTP 请求方法、超时、 Cookiejar、重定向和其他重要事情都不重要的简单 GET 请求来说,这是一个很好的选择。

带有 流上下文fopen()或带有 setopt的 cURL 都是具有您所能想到的每一个位和选项的强大演练。

除此之外,由于最近的一些网站黑客攻击,我们不得不保护我们的网站更多。在这样做的过程中,我们发现 File _ get _ content无法工作,而 卷发仍然可以工作。

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

不管怎样,我们的代码现在与 卷发一起工作。

这是一个老话题,但是在我最近的一次 API 测试中,cURL 更快、更稳定。有时候,大型请求上的 file _ get _ content 需要5秒以上的时间,而 cURL 只需要1.4到1.9秒,比 cURL 快一倍。

我需要添加一个注意事项,我只是发送 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 库的最新版本有170多个不同的函数,可以向 API 发送正确的请求。那里 8年前只有70个功能 事实: 仍在开发中。

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

什么是 file _ get _ content ()

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

$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 is open source third party library. You can reach the git repo from 给你. This function "模拟" 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.

让我们检查一下 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 和 morefile_get_contents()使用 HTTP 和 HTTPS 协议 通讯。
  • CURL可用于读取、更新和删除文件 但是 file_get_contents()只允许您读取 文件。
  • CURLfile_get_contents()更安全、速度更快
  • CURLfile_get_contents()更难理解。