file_get_contents()与curl一起使用PHP调用API

时间:2012-03-11 21:31:19

标签: php rest

根据Google Custom Search 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()没有工作和卷曲呢?
  2. 我也可以使用fsocket吗?

3 个答案:

答案 0 :(得分:12)

问题1:

首先,您应该检查设置allow_url_fopen,AFAIK这是file_get_contents()不应该工作的唯一原因。同样弃用safe_mode可能会导致此问题。

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

问题2:

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

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

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

答案 1 :(得分:5)

file_get_contents可能会在获取IP后重写您的请求,获得与以下内容相同的内容:

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

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

答案 2 :(得分:4)

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

2)正如评论中提到的那样,file_get_contents要求php.ini启用allow_url_fopen

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

4)关于这个问题的标题:对于复杂的HTTP事务,cURL可以更加自定义和有用,而不是file_get_contents。但是,应该提到的是,使用stream contexts可以让您为file_get_contents电话设置大量设置。但是,我认为cURL仍然更加完整,因为它可以让您使用multiple parallel handlers