php使用curl下载https资源文件如何实现?

 jason---zhu 发布于 2022-11-14 17:59

代码如下:

$url = 'https://www.xxx.com/xxx.mp3';

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
var_dump(curl_error($ch));


提示错误:SSL: certificate verification failed (result: 5)

然后网上搜了一大片:最多的解决方法是加上如下代码:

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, false);

加上之后又报错:

SSL: CA certificate set, but certificate verification is disabled

请问如何解决????

4 个回答
  • 把你要爬的网址贴出来吧

    2022-11-14 18:13 回答
  • curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, false);

    可用吧,平常这样没出现问题啊

    2022-11-14 18:13 回答
  • 百度https这样可以,你要爬那个地址

    <?php
    
    $url = 'https://www.baidu.com/';
    
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    $output = curl_exec($ch);
    if (!$output) {
        echo curl_error($ch);
    } else {
        var_dump($output);
    }
    
    ?>
    2022-11-14 18:13 回答
  • 补充代码=_=

    <?php
    $urls = [
        "https://cdn.pixabay.com/photo/2017/01/28/21/48/lion-2016620__340.jpg 1x, https://cdn.pixabay.com/photo/2017/01/28/21/48/lion-2016620__480.jpg",
        "https://cdn.pixabay.com/photo/2017/02/20/19/29/architecture-2083687__340.jpg 1x, https://cdn.pixabay.com/photo/2017/02/20/19/29/architecture-2083687__480.jpg",
        "https://cdn.pixabay.com/photo/2017/02/06/12/34/reptile-2042906__340.jpg 1x, https://cdn.pixabay.com/photo/2017/02/06/12/34/reptile-2042906__480.jpg"
    ];
    
    foreach ($urls as $k => $v) {
         if (!empty($v) && preg_match("~^http~i", $v)) {
            $nurl[$k] = trim(str_replace(' ', "%20", $v));
            $curl[$k] = curl_init($nurl[$k]);
            curl_setopt($curl[$k], CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
            curl_setopt($curl[$k], CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($curl[$k], CURLOPT_HEADER, 0);
            curl_setopt($curl[$k], CURLOPT_CONNECTTIMEOUT, 20);
            curl_setopt($curl[$k], CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($curl[$k], CURLOPT_SSL_VERIFYHOST, false);        
            if (!isset($handle)) {
               $handle = curl_multi_init();
            }
            curl_multi_add_handle($handle, $curl[$k]);
          }
          continue;
    }
    $active = null;
    do {
       $mrc = @curl_multi_exec($handle, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
       while ($active && $mrc == CURLM_OK) {
           if (curl_multi_select($handle) != -1) {
              do {
                 $mrc = curl_multi_exec($handle, $active);
              } while ($mrc == CURLM_CALL_MULTI_PERFORM);
           }
       }
    
    foreach ($curl as $k => $v) {
       var_dump(curl_error($curl[$k]));
    }

    会有报错:

    SSL: CA certificate set, but certificate verification is disabled

    已解决

    curl_setopt($curl[$k], CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);

    改成:

    curl_setopt($curl[$k], CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6);

    就可以了。

    2022-11-14 18:13 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有