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

Dan*_*cco 9 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
Run Code Online (Sandbox Code Playgroud)

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

然后我尝试使用以下命令从我的PHP代码调用API:

$json = file_get_contents("$url") or die("failed");
Run Code Online (Sandbox Code Playgroud)

其中$ url与浏览器上的相同,但我的PHP代码在尝试打开时死亡.

之后我尝试了curl,它起作用了.代码是这样的:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$body = curl_exec($ch);
Run Code Online (Sandbox Code Playgroud)

问题:

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

Vyk*_*tor 12

问题1:

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

哦,基于你的评论,你必须http://在使用文件系统函数时添加到URL ,它是一个包装器告诉php你需要使用http请求,而不是它的功能认为你需要打开./google.com(相同google.txt).

问题2:

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

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

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


Fil*_*kor 5

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

file_get_contents("xxx.yyy.www.zzz/app1",...)
Run Code Online (Sandbox Code Playgroud)

如果您在请求中进行IP寻址,许多服务器将拒绝您访问.
使用cURL时,此问题不存在.它解析了在设置时留下请求的主机名,因此服务器响应不严重.
这也可能是"原因"......


El *_*rto 5

  1. 为什么打电话时要使用引号file_get_contents

  2. 正如评论中提到的,file_get_contents需要在php.iniallow_url_fopen上启用。

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

  4. 关于这个问题的标题:cURL 可以比file_get_contents. 不过,应该提到的是,使用流上下文允许您为调用进行大量设置file_get_contents然而,我认为 cURL 仍然更完整,因为它为您提供了使用多个并行处理程序的可能性。