2009-08-27 207 views
27

我试图使用CURL获取页面的内容。正在执行提取的页面是https,并且它正试图提取的页面也是https。我遇到了所有我尝试设置的错误“无法解析主机”。CURL和HTTPS,“无法解析主机”

$c=curl_init(); 
curl_setopt($c, CURLOPT_URL,$url); 
//curl_setopt($c, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:x.x.x) Gecko/20041107 Firefox/x.x"); 
curl_setopt ($c, CURLOPT_RETURNTRANSFER, TRUE); 
//curl_setopt($c, CURLOPT_SSL_VERIFYPEER, TRUE); 
//curl_setopt($c, CURLOPT_SSL_VERIFYHOST, TRUE); 
curl_setopt($c, CURLOPT_HEADER, FALSE); 

$html=curl_exec($c); 

if($html === false) { 
    echo curl_error($c); 
} 
else { 
    echo 'Operation completed without any errors'; 
} 


curl_close($c); 

任何想法?

+1

你传递协议,https://开头,作为URL的一部分? – JYelton 2009-08-27 15:03:18

+0

是的 - 尝试str_replace使它http,但没有改变错误。 – swt83 2009-08-27 15:11:10

回答

21

也许一个DNS的问题?

试试你的网址与this code

$_h = curl_init(); 
curl_setopt($_h, CURLOPT_HEADER, 1); 
curl_setopt($_h, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($_h, CURLOPT_HTTPGET, 1); 
curl_setopt($_h, CURLOPT_URL, 'YOUR_URL'); 
curl_setopt($_h, CURLOPT_DNS_USE_GLOBAL_CACHE, false); 
curl_setopt($_h, CURLOPT_DNS_CACHE_TIMEOUT, 2); 

var_dump(curl_exec($_h)); 
var_dump(curl_getinfo($_h)); 
var_dump(curl_error($_h)); 
+4

我的系统管理员修复了一个DNS问题,谢谢。 – swt83 2009-08-29 13:44:26

+8

你救了我的一天。我发现我的问题。它将“http://”附加到我的网址中,使其无效。 – Foreever 2014-08-18 12:20:00

+1

@ KB22你能否详细解释一下你的代码? – 2017-02-21 07:34:05

-3

您可能需要启用HTTPS部分:

curl_setopt($c, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, 2); 

如果你需要验证(验证自己的身份),你可能需要这个太:

curl_setopt($c, CURLOPT_USERPWD, 'username:password'); 
3

只是一个可以helpful-我有我的笔记本电脑(它通过无线网络启动后连接)这个麻烦与Apache,并重新启动服务器说明(后连接)修复了这个问题。我想在我的情况下,这可能是与apache启动离线,也许有注意到DNS查找失败?

+0

这个线程备份您的要求(如果不是你;))https://bbs.archlinux.org/viewtopic.php?id=78849 – Devaro 2017-03-22 11:31:39

47

我发现CURL可以决定使用IPv6,在这种情况下,它会尝试解析,但不会得到IPv6答案(或其他问题)并超时。

您可以尝试命令行开关-4来测试。

在PHP中,你可以通过设置这个配置此行:

curl_setopt($_h, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); 
+3

只是一个供参考。有一个PHP Curl的问题不起作用。服务器上的其他所有内容都正常工作。添加了这些选项并进行修复。奇怪的是,直到最近,一切都很好,没有任何改变。确定无疑的问题,但很高兴这工作! – Valien 2017-03-21 19:53:11

+1

这刚刚开始发生在我身上。浪费了我生命中的5个小时... – 2017-03-22 01:02:25

+3

不知道昨天发生了什么(2017年3月21日),但我们在多台服务器上遇到了运行PHP 7的问题。将此行添加到Curl请求并重新启动PHP-FPM 。 – 2017-03-22 08:39:03

21

我有同样的问题。 Coudn't解决google.com。在我正在使用的php fpm中存在一个错误。重新启动php-fpm为我解决了它。

+3

这也发生在我身上。主机名在CLI上解决得很好,但PHP-FPM无法解析ElasticSearch集群的主机名,直到重新启动PHP-FPM。相当烦人,因为我不知道如何防止它,我们即将把这台服务器投入生产。 – 2017-03-22 08:28:16

+2

我看到相同的问题 – g18c 2017-03-22 09:47:48

+2

重新启动'php7.0-fpm'(因为我在php7.0上)为我解决了它。 – Devaro 2017-03-22 11:34:18

-2

由于您可能正在本地服务器环境中执行此操作,因此您会收到此错误。在进行cURL呼叫时,您需要跳过证书检查。为此,只需添加以下选项

curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, 0); 
-1

我们需要将主机安全证书添加到php.ini文件。对于本地开发环境,我们可以在您的本地php.ini中添加cacert.pem

do phpinfo();并提交你的php.ini路径开放,并添加注释去掉; curl.capath

curl.capath = path_of_your_cacert.pem

+0

不幸的是,您的文章涉及不同的问题。我不认为这个解决方案涉及“*无法解析主机*”错误。 – 2017-06-20 00:23:05

1

add yourlocalhost
ex。/etc/hosts目录中的127.0.0.1 cards.localhost 。 现在重新启动Apache服务器

+1

你能解释一下这将如何解决OP问题吗? – Gar 2017-11-22 08:56:29

+0

我不明白你的问题哥们。 – sunil 2017-11-24 09:35:14