这两段代码在访问 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()
只允许您读取文件。 -
CURL
比file_get_contents()
更安全、更快捷 -
CURL
比file_get_contents()
更难理解。