繁体   English   中英

PHP cURL 与 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()是一个简单的螺丝刀。 非常适合标头、HTTP 请求方法、超时、cookiejar、重定向和其他重要事项无关紧要的简单 GET 请求。

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

除此之外,由于最近的一些网站黑客攻击,我们不得不更加保护我们的网站。 failed to work, where still would work.这样做时,我们发现无法工作,而仍然可以工作。

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

; Disable allow_url_fopen for security reasons
allow_url_fopen = 0

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

这是一个老话题,但在我对我的 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是第 3 部分库。

简单比较:最新版本的 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 请求的基本示例。 您可以使用 CURLOPT_HTTPHEADER、CURLOPT_SSL_VERIFYPEER 等函数向 curl 对象添加更多参数和选项。 这些类型的参数完全取决于您和您尝试使用的服务。

CURL 与 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()理解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM