【问题标题】:CURL and HTTPS, "Cannot resolve host"CURL 和 HTTPS,“无法解析主机”
【发布时间】:2010-11-23 10:06:32
【问题描述】:

我正在尝试使用 CURL 获取页面的内容。正在获取的页面是 https,它试图获取的页面也是 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);

有什么想法吗?

【问题讨论】:

  • 您是否将协议 https:// 作为 url 的一部分传递?
  • 是的 -- 尝试将 str_replace 设置为 http 但这并没有改变错误。

标签: php curl


【解决方案1】:

我发现 curl 可以决定使用 IPv6,在这种情况下,它会尝试解析但没有得到 IPv6 答案(或类似的结果)并超时。

你可以试试 curl 命令行开关 -4 来测试一下:

curl -4 http://x.com

在 PHP 中,您可以通过设置此行来配置此行:

curl_setopt($c, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);

此选项的官方手册页:https://curl.se/libcurl/c/CURLOPT_IPRESOLVE.html

【讨论】:

  • 仅供参考。遇到 PHP Curl 无法正常工作的问题。服务器上的其他一切工作正常。添加了这些选项并修复了它。奇怪的是,直到最近,一切都运行良好,没有任何变化。肯定是晦涩的问题,但很高兴这有效!
  • 这也刚刚开始发生在我身上。浪费了我生命中的 5 个小时......
  • 不确定昨天(2017 年 3 月 21 日)发生了什么,但我们在运行 PHP 7 的多台服务器上遇到了这个问题。将此行添加到 Curl 请求并重新启动 PHP-FPM 后问题得到解决。
  • 昨天(17 年 3 月 21 日)我们还发现服务器停止使用 DNS 查找 curl,真的很奇怪。重新启动 php5.6-fpm 工作,然后在一天后(今天)再次失败,将输入 ipv4 dns 选项并在再次失败时进行测试。
  • Ubuntu 错误是fixed。检查您的 apt 日志以查看它是否已更新为 cat /var/log/apt/history.log。如果不是,您可能需要运行apt-get updateapt-get upgrade。修复后重新启动 PHP-FPM 即可解决问题。
【解决方案2】:

可能是 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)); 

【讨论】:

  • 你拯救了我的一天。我发现了我的问题。它将“http://”附加到我的网址使其无效。
  • @KB22 你能解释一下你的代码吗?
  • 不适合我。还是给我Could not resolve host
  • 也许这对某人有帮助。使用 docker 我偶然发现了这个错误。在客户机中编辑主机文件已修复。如果您在其他地方有想法,则无需多想,但很有用
  • 它没有解释为什么这应该工作,它不适合我。
【解决方案3】:

我遇到了同样的问题。无法解析 google.com。我正在使用的 php fpm 中某处存在错误。重新启动 php-fpm 为我解决了这个问题。

【讨论】:

  • 这也发生在我身上。主机名在 CLI 上解析得很好,但 PHP-FPM 无法解析我们的 ElasticSearch 集群的主机名,直到重新启动 PHP-FPM。很烦人,因为我还不知道如何防止它,我们即将把这个服务器投入生产。
  • 我看到了同样的问题
  • 重启php7.0-fpm(因为我在php7.0上)也为我解决了这个问题。
  • 在 php5-fpm (5.5.9) 重新启动时看到相同的内容修复了它,但过一段时间又回来了
  • 对我来说它不是 cURL,而是 SOAP 客户端和 PDO 中的主机名,重启后它会在一段时间后恢复。我还在扯我的头发
【解决方案4】:

只是一个可能有用的注释-我的笔记本电脑上的 Apache 遇到了这个问题(启动后通过 wifi 连接),并且重新启动服务器(连接后)解决了这个问题。我想在我的情况下,这可能与 apache 离线启动并可能注意到 DNS 查找失败有关?

【讨论】:

【解决方案5】:

在 Ubuntu 上的 glibc 中存在一个当前错误,它可以产生这种效果: https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/1674733

要解决它,请更新 libc 和所有相关(将升级的软件包:libc-bin libc-dev-bin libc6 libc6-dev libfreetype6 libfreetype6-dev locales multiarch-support)并重新启动服务器。

【讨论】:

    【解决方案6】:

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

    做 phpinfo();并打开您的 php.ini 路径并添加取消注释;curl.capath

    curl.capath=path_of_your_cacert.pem

    【讨论】:

    • 很遗憾,您的帖子涵盖了不同的问题。我认为此解决方案与“无法解析主机”错误无关。
    【解决方案7】:

    如果您在 Windows XAMPP/WAMP 上执行此操作,它可能不会像我的情况那样工作。

    我解决了设置 Laravel 的 Homestead/Vagrant 解决方案以创建我的 (Ubuntu) 开发环境的问题 - 它内置:Nginx、PHP 5.6、PHP 7.3、PHP 7.2、PHP 7.1、MySQL、PostgreSQL、Redis、Memcached ,节点...仅举几例。

    有关如何设置环境的信息,请参阅 here - 这真的很值得!

    Laravel Homestead 是一个官方的、预打包的 Vagrant 盒子,它为您提供了一个美妙的开发环境,而无需您在本地机器上安装 PHP、Web 服务器和任何其他服务器软件。再也不用担心搞砸你的操作系统了!流浪盒是完全一次性的。如果出现问题,您可以在几分钟内销毁并重新创建盒子!

    然后您可以在几秒钟内轻松切换 PHP 版本或设置更多虚拟主机、新数据库。

    【讨论】:

      【解决方案8】:

      经过以上所有尝试,仍然无法解决我的问题。 但是为我的问题找到了新的解决方案。

      在您要发出请求的服务器上,应该有一个虚拟主机条目。

      sudo vim /etc/hosts
      

      并插入

      192.xxx.x.xx www.domain.com

      如果您从服务器向自身发出请求,那么为了解析您的虚拟主机或识别它,服务器将需要上述内容,否则服务器将无法理解您的请求(来源)主机。

      【讨论】:

        【解决方案9】:

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

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

        【讨论】:

          【解决方案10】:

          您可能必须启用 HTTPS 部分:

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

          如果您需要验证(验证自己),您可能也需要这个:

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

          【讨论】:

            【解决方案11】:

            添加您的本地主机
            前任。 127.0.0.1 卡片.localhost 在 /etc/hosts 目录中。 现在重启apache服务器

            【讨论】:

            • 您能解释一下这将如何解决 OP 问题吗?
            • 我不明白你的问题,伙计。
            猜你喜欢
            • 1970-01-01
            • 2014-09-12
            • 1970-01-01
            • 2011-05-20
            • 2021-12-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多