file_get_contents()与curl相比,前者用于用PHP调用API


file_get_contents() vs. curl for invoking APIs with PHP

根据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代码在试图打开它时已经奄奄一息

之后,我尝试了卷曲,效果很好。代码是这样的:

$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吗

问题1:

首先,您应该检查ini设置allow_url_fopen,AFAIK这是file_get_contents()不工作的唯一原因。同样,不推荐使用的safe_mode也可能导致这种情况。

哦,根据你的评论,当与文件系统函数一起使用时,你必须将http://添加到URL中,这是一个包装器,告诉php你需要使用http请求,没有it函数,你认为你需要打开./google.com(与google.txt相同)。

问题2:

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

我个人的意见是,你应该坚持cURL,因为:

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

file_get_contents可能会在获得IP后重写您的请求,获得与相同的东西

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

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

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

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

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

4) 关于这个问题的标题:与file_get_contents相比,cURL在处理复杂的HTTP事务时更具可定制性和实用性。不过,应该提到的是,使用流上下文可以为file_get_contents调用进行大量设置。然而,我认为cURL仍然更完整,因为它为您提供了使用多个并行处理程序的可能性。