PHP cURL与file_get_contents

Sal*_*ali 100 php curl file-get-contents

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

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

$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);
Run Code Online (Sandbox Code Playgroud)

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

print_r(json_decode($result))
Run Code Online (Sandbox Code Playgroud)

Xeo*_*oss 116

file_get_contents()是一个简单的螺丝刀.非常适合简单的GET请求,其中标头,HTTP请求方法,超时,cookiejar,重定向和其他重要事项无关紧要.

fopen()使用流上下文或带有setopt的 cURL 是powerdrills,您可以想到每个位和选项.

  • `file_get_contents`也允许设置上下文,这意味着您可以根据需要设置标题字段. (18认同)
  • 为了保持这个比喻,请注意cURL是一个带有复杂钻孔夹头的动力钻,需要你很好地了解它才能真正改变它(阅读:设置cURL选项有点单调乏味,但可以做任何你想做的事情). (14认同)
  • 作为@ velop的评论的补充,通过流上下文,还可以通过一个file_get_contents请求发送POST,PUT,身份验证,标头,内容,代理等等 (4认同)
  • @Xeoncross,性能明智哪一个更快? (2认同)

vr_*_*ver 24

除此之外,由于最近的一些网站黑客攻击,我们不得不更多地保护我们的网站.在这样做时,我们发现file_get_contents无法工作,curl仍然可以工作.

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

; Disable allow_url_fopen for security reasons
allow_url_fopen = 0
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,我们的代码现在都适用于curl.

  • @frustratedtech这些是什么"漏洞"? (14认同)
  • 是的,`file_get_contents`要求`allow_url_fopen`是真的. (8认同)
  • 是的,许多托管公司正在禁用`file_get_contents()`,因为已知使用该功能的许多漏洞利用.cURL是人们现在应该在代码中使用的功能. (2认同)
  • 托管公司禁用`allow_url_fopen`,因为他们错误地认为它是'allow_url_include`.可以使用`allow_url_fopen`和`file_get_contents`. (2认同)
  • @vr_driver这些链接与`file_get_contents()`无关 (2认同)

Ivi*_*pić 16

这是一个古老的话题,但在我对我的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);
Run Code Online (Sandbox Code Playgroud)

此请求将以0.01秒的最大值返回数据

  • 0.02ms = 20微秒; 你说0.1微秒这是不对的. (3认同)
  • 这几乎是`file_get_contents'的两倍.我只是做了一些API调用来确认.`file_get_contents`为0.8秒,`curl`为0.49秒(3个API调用) (2认同)

ogu*_*rit 7

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

\n
\n

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

\n
\n

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

\n

什么是 file_get_contents()

\n

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

\n
$data = http_build_query(\n    array(\n        \'user_id\'   => \'558673\',\n        \'user_name\' => \'John Doe\'\n    )\n);\n\n$config = array(\'http\' =>\n    array(\n        \'method\'  => \'POST\',\n        \'header\'  => \'Content-Type: application/x-www-form-urlencoded\',\n        \'content\' => $data\n    )\n);\n\n$context = stream_context_create($config);\n\n$result = file_get_contents(\'https://google.com\', false, $context);\n
Run Code Online (Sandbox Code Playgroud)\n

什么是curl()

\n

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

\n

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

\n
$url = API_ENDPOINT."/get_movies";\n        \n  $curl = curl_init();\n         \n  $params = array(\n    \'category\' => $category,\n    \'limit\' => $limit,\n    \'start\' => $start,\n    \'order\' => $order,\n    \'term\' => $term\n  );\n\n  $params_string = http_build_query($params);\n\n  curl_setopt($curl, CURLOPT_URL, $url);\n  curl_setopt($curl, CURLOPT_POST, TRUE);\n  curl_setopt($curl, CURLOPT_POSTFIELDS, $params_string);\n  curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);\n  \n  $data = curl_exec($curl);     \n  curl_close($curl);\n\n  echo json_decode($data,TRUE); //service returns json in this sample\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

CURL 与 file_get_contents()

\n
    \n
  • CURL能够处理复杂的 HTML 通信,但\nfile_get_contents()不能。
  • \n
  • CURL支持 HTTP PUT、GET、POST,但file_get_contents()支持简单的 HTTP GET 和 HTTP POST 请求。
  • \n
  • CURL支持缓存和cookie,但\nfile_get_contents()不\xe2\x80\x99t支持缓存、cookie等。
  • \n
  • CURL能够使用 HTTP、HTTPS、FTP、FTPS 等 \nfile_get_contents()使用 HTTP 和 HTTPS 协议\n进行通信。
  • \n
  • CURL可用于从服务器读取、更新和删除文件,但file_get_contents()仅允许您读取文件。
  • \n
  • CURL比更安全、更快速file_get_contents()
  • \n
  • CURL比 理解起来要复杂一些file_get_contents()
  • \n
\n