无法让 cURL 或 file_get_contents 在 PHP 中工作

Posted

技术标签:

【中文标题】无法让 cURL 或 file_get_contents 在 PHP 中工作【英文标题】:Cannot Get cURL or file_get_contents to work in PHP 【发布时间】:2015-08-28 23:26:49 【问题描述】:

我在获取返回 JSON 的 https 页面的 cURL 请求或 file_get_contents() 时遇到问题。请注意,我查看了多个存在类似问题的 *** 主题,但似乎都没有解决我的具体问题。

背景:我使用的是运行 OS X 10.10.3 (Yosemite) 的 MAC。我刚刚安装了 XAMPP 5.6.8,这样我就可以运行本地 Web 服务器来玩 php 等。

目标:我想简单地显示由 https GET 请求返回的 JSON 对象的内容。对于上下文,页面是https://api.discogs.com/releases/249504。

操作:我已阅读其他帖子,为了检索 HTTPS 页面,我必须在我的 php.ini 文件中进行以下开箱即用的更改,我已经完成了: - 取消注释/打开 allow_url_fopen=On - 取消注释/打开 allow_url_include=on - 取消注释扩展=php_openssl.dll

结果: 使用 file_get_contents()...

代码:

<?php
  $url = "https://api.discogs.com/releases/249504";
  $text = file_get_contents($url);
  var_dump($text);
?>

结果:

Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in /Applications/XAMPP/xamppfiles/htdocs/phpWorkspace/firstPhp/firstPhp.php on line 5

Warning: file_get_contents(): Failed to enable crypto in /Applications/XAMPP/xamppfiles/htdocs/phpWorkspace/firstPhp/firstPhp.php on line 5

Warning: file_get_contents(https://api.discogs.com/releases/249504): failed to open stream: operation failed in /Applications/XAMPP/xamppfiles/htdocs/phpWorkspace/firstPhp/firstPhp.php on line 5

布尔(假)

使用 cURL...

代码: https://api.discogs.com/releases/249504";

//  Initiate curl
  $ch = curl_init();

// Will return the response, if false it print the response
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// Set the url
  curl_setopt($ch, CURLOPT_URL,$url);

// Execute
  $result=curl_exec($ch);

// Closing
  curl_close($ch);

  var_dump($result);
?>

结果: 布尔(假)

任何建议都会非常有帮助。我已经根据其他 SO 帖子玩过不同的 cURL 调用,每个都返回 NULL、与证书/身份验证相关的错误,或者像上面那样。

更新!

我在我的 cURL 代码中添加了 CURLOPT_SSL_VERIFYPEER 并将其设置为关闭,以验证我至少可以与服务器通信 - 这有助于我确定我需要提供用户代理。但是,当我删除 SSL_VERIFYPEER 时,我仍然遇到证书问题。

作为最后的努力,我卸载了 XAMPP,并从 Mac OS 中打开了 php/apache。配置后,开箱即用的 cURL 和 FILE_GET_CONTENTS() 调用都可以使用与上面相同的代码与用户代理一起工作 [令人沮丧!]。

我的直觉告诉我,我在 XAMPP 中与我的证书相关的配置错误。有趣的是,虽然我在网上看到的不多,因为这是其他 XAMPP 用户的问题。

【问题讨论】:

file_get_contents(): SSL operation failed with code 1. And more的可能重复 false = curl 失败,curl_error($ch) 会告诉你原因。但 SSL 错误很清楚 - 您的 ssl 库无法验证远程站点的 ssl 证书,因此它中止了连接。 【参考方案1】:

尝试添加这个

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);

证书未成功验证。根据问题的严重程度,这可能无法纠正。

你不应该依赖这个作为修复,但是它应该告诉你你的系统是否可以与他们的系统通信。参考 Frankzers 发布的帖子。

【讨论】:

您能否解释一下为什么curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); 的安全性相当差。 此时他需要查看它是否连接到服务器。 * 更新帖子 * @Thomas - 单独添加 VERIFYPEER 并没有帮助,但是将其与用户代理 curl_setopt(..., CURLOPT_USERAGENT, ...) 一起添加确实有效!现在,我已经在许多地方读到了将 CURLOPT_SSL_VERIFYPEER 设置为 off 是不好的。关于可能发生的事情有什么进一步的想法吗?我会注意到,如果 CURLOPT_SSL_VERIFYPEER 设置为 false,单独使用 USERAGENT 是行不通的...

以上是关于无法让 cURL 或 file_get_contents 在 PHP 中工作的主要内容,如果未能解决你的问题,请参考以下文章

解决php无法通过file_get_contents或curl采集页面内容

php中的file_get_contents或curl?

是否可以使用 file_get_contents() 或 cURL 进行代理?

PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题

php如何获取通过CURL或file_get_contents抓取者的IP地址

file_get_contents是打工文件或URL获取内容的方法,比其稳定的还有curl_get_contents