无法让 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采集页面内容
是否可以使用 file_get_contents() 或 cURL 进行代理?
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题