代码之家  ›  专栏  ›  技术社区  ›  swt83

curl和https,“无法解析主机”

  •  35
  • swt83  · 技术社区  · 16 年前

    我正在用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);
    

    有什么想法吗?

    10 回复  |  直到 6 年前
        1
  •  24
  •   Keelan    9 年前

    可能是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)); 
    
        2
  •  48
  •   Jacob Bruinsma    12 年前

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

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

    在PHP中,可以通过设置以下内容来配置此行:

    curl_setopt($_h, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
    
        3
  •  27
  •   TecBeast    10 年前

    我也有同样的问题。无法解析google.com。php fpm中有一个bug,我正在使用它。重启php fpm为我解决了这个问题。

        4
  •  5
  •   Rick    14 年前

    只是一个有帮助的提示-我在笔记本电脑上使用Apache时遇到了这个问题(启动后通过WiFi连接),重新启动服务器(连接后)解决了这个问题。我想在我的例子中,这可能与Apache离线启动有关,也许在那里发现DNS查找失败了?

        5
  •  2
  •   LewisEmilyR    8 年前

    Ubuntu上的glibc中有一个当前的bug,它可以产生以下效果: https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/1674733

    要解决此问题,请更新libc和所有相关的(将要升级的包:libc-bin libc dev-bin libc6 dev libfreetype6 libfreetyp6 dev locales multiarch支持)并重新启动服务器。

        6
  •  -1
  •   Prince    9 年前

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

    do phpinfo();并将php.ini路径文件打开并添加uncomment;curl.capath

    curl.capath=路径

        7
  •  -1
  •   sunil    7 年前

    添加本地主机
    例如127.0.0.1 cards.localhost 在/etc/hosts目录中。 现在重新启动Apache服务器

        8
  •  -1
  •   Picard    6 年前

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

    我解决了设置Laravel的homestead/vagrant解决方案来创建我的(ubuntu)开发环境的问题-它内置了:nginx、php 5.6、php 7.3、php 7.2、php 7.1、mysql、postgresql、redis、memcached、node…仅举几个例子。

    here 有关如何设置环境的信息-这真的值得付出努力!

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

    然后您可以轻松地切换PHP版本或设置更多的虚拟主机,只需几秒钟就可以创建新的数据库。

        9
  •  -2
  •   Muhammad Haroon Bashir    9 年前

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

    curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($c, CURLOPT_SSL_VERIFYHOST,  0);
    
        10
  •  -3
  •   Keelan    9 年前

    您可能需要启用https部分:

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

    如果您需要验证(自我验证),您也可能需要:

    curl_setopt($c, CURLOPT_USERPWD, 'username:password');
    
    推荐文章