PHP cURL与文件获取内容

f87krz0w  于 2022-11-13  发布在  PHP
关注(0)|答案(4)|浏览(186)

在访问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))
gev0vcfq

gev0vcfq1#

file_get_contents()是一个简单的螺丝刀。非常适合简单的GET请求,其中头部,HTTP请求方法,超时,cookiejar,重定向,和其他重要的事情都不重要。
fopen()stream context或cURL与setopt是电钻,具有您能想到的每一个位和选项。

nhaq1z21

nhaq1z212#

除此之外,由于最近的一些网站黑客攻击,我们不得不加强网站的安全性。在这样做的过程中,我们发现file_get_contents无法工作,而curl仍然可以工作。
不是100%,但我相信这个php.ini设置可能已经阻止了file_get_contents请求。

; Disable allow_url_fopen for security reasons
allow_url_fopen = 0

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

btxsgosb

btxsgosb3#

这是一个老主题,但在我的一个API上的最后一次测试中,cURL更快,更稳定。有时较大的请求需要超过5秒的file_get_contents,而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秒内返回数据

nhhxz33t

nhhxz33t4#

我知道这是一个老主题,但我相信这真的很重要。现在,有很多不同的8年多前。我们都知道,Curl是第三方库。

简单比较:Curl库的最新版本有超过170个不同的函数,能够向API发送正确的请求。8年前只有70个函数。事实:仍在开发中。

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

什么是文件获取内容()

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是一个开源的第三方库。你可以从here访问git repo。这个函数“模拟”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对象添加更多参数和选项。这些类型的参数完全取决于您和您尝试使用的服务。

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和morefile_get_contents()使用HTTP和HTTPS协议进行通信。
  • CURL可用于从服务器读取、更新和删除文件,但file_get_contents()只允许您读取文件。
  • CURLfile_get_contents()更安全、更快
  • CURLfile_get_contents()更难理解。

相关问题