【问题标题】:file_get_contents() vs. curl for invoking APIs with PHP使用 PHP 调用 API 的 file_get_contents() 与 curl
【发布时间】:2012-03-11 21:31:19
【问题描述】:

根据 Google 自定义搜索 API 的描述,您可以使用 REST 接口的 GET 动词调用它,如示例:

GET https://www.googleapis.com/customsearch/v1?key=INSERT-YOUR-KEY&cx=017576662512468239146:omuauf_lfve&q=lectures

我设置了我的 API 密钥和自定义搜索引擎,当我直接将我的测试查询粘贴到我的浏览器上时,它运行良好,并且我得到了显示给我的 JSON 文件。

然后我尝试使用以下方法从我的 PHP 代码中调用 API:

$json = file_get_contents("$url") or die("failed");

其中 $url 与在浏览器上运行的相同,但我的 PHP 代码在尝试打开它时死掉了。

之后我尝试使用 curl,它成功了。代码是这样的:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$body = curl_exec($ch);

问题

  1. 为什么 file_get_contents() 不起作用而 curl 起作用?
  2. 我也可以使用 fsocket 吗?

【问题讨论】:

标签: php rest


【解决方案1】:

问题一:

首先你应该检查ini设置allow_url_fopen,AFAIK这是file_get_contents()不应该工作的唯一原因。不推荐使用的safe_mode 也可能导致此问题。

哦,根据您的评论,您必须在与file system 函数一起使用时将http:// 添加到URL,这是一个wrapper 告诉php 您需要使用http 请求,没有它的功能认为您需要打开./google.com(同google.txt)。

问题2:

是的,您几乎可以使用套接字构建任何 cURL 请求。

我个人认为你应该坚持使用 cURL,因为:

  • 超时设置
  • 处理所有可能的 HTTP 状态
  • 简单详细的配置(无需详细了解HTTP头)

【讨论】:

    【解决方案2】:

    file_get_contents可能会在获取IP后重写你的请求,获取的内容与:

    file_get_contents("xxx.yyy.www.zzz/app1",...)
    

    如果您在请求中通过 IP 寻址,许多服务器将拒绝您访问。
    使用 cURL,这个问题就不存在了。它会在您设置请求时解析主机名,因此服务器不会粗鲁地响应。
    这也可能是“原因”..

    【讨论】:

    • 很有趣,非常感谢。我会验证是否是这个原因。
    【解决方案3】:

    1) 为什么在调用file_get_contents 时使用引号?

    2) 正如评论中提到的,file_get_contents 需要在您的php.ini 上启用allow_url_fopen

    3) 您可以使用fsockopen,但您必须手动处理 HTTP 请求/响应,这将在您拥有 cURL 时重新发明轮子。 socket_create 也是如此。

    4) 关于这个问题的标题:cURL 可以比file_get_contents 更可定制和更有用地处理复杂的 HTTP 事务。不过,应该提到的是,使用stream contexts 可以让您为file_get_contents 调用进行大量设置。但是,我认为 cURL 仍然更完整,因为它为您提供了使用 multiple parallel handlers 的可能性。

    【讨论】:

      猜你喜欢
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 2018-01-21
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多