【问题标题】:cURL taking long time to get the final URL of redirect URLcURL 需要很长时间才能获得重定向 URL 的最终 URL
【发布时间】:2017-05-23 14:05:45
【问题描述】:

下面的代码 sn-p 是使用 cURL 从重定向 URL 中获取最终 URL(包含 media/zip/rar 文件)。它得到最终的 URL,这是毫无疑问的,但它所做的是根据文件的大小,它会随着时间的推移而变化来获取 URL。

假设最终 URL 的文件为 1MB,检索大约需要 5 秒。但如果文件大约 35MB,则需要大约 150 秒的时间。我认为 cURL 正在下载结果并最终从结果中获取 URL。

<?php
echo get_rurl("x_url");//1.2MB -> 5-10sec
//echo get_rurl("y_url");//31.6MB -> 150sec
function get_rurl($url){
    // initialize cURL
    $curl = curl_init($url);
    curl_setopt_array($curl, array(
        CURLOPT_RETURNTRANSFER  => true,
        CURLOPT_FOLLOWLOCATION  => true,
    ));
    // execute the request
    $result = curl_exec($curl);
    // fail if the request was not successful
    if ($result === false) {
        curl_close($curl);
        return null;
    }
    // extract the target url
    $redirectUrl = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL);
    curl_close($curl);
    return $redirectUrl;
}
?>

我不能使用file_get_content(),因为我只想从给定的重定向 URL 中获取最终 URL。

简而言之 - 如何在不下载结果的情况下从重定向 URL 获取最终 URL。

希望我说清楚。任何帮助将不胜感激。

【问题讨论】:

    标签: php url redirect curl


    【解决方案1】:

    这适用于CURLINFO_EFFECTIVE_URL,但对于它,选项CURLOPT_FOLLOWLOCATION 必须设置为TRUE。这是因为CURLINFO_EFFECTIVE_URL 准确地返回了它所说的内容,即最终加载的有效网址。如果是CURLOPT_FOLLOWLOCATION=False,那么有效的url就是请求的url,否则就是被重定向到的最终url。

    我使用curl_getinfo 完成了这项工作。这为我提供了有关上次转移的信息

    <?php
    echo get_rurl("xurl");
    //echo get_rurl("yurl");
    function get_rurl($url){
        // initialize cURL
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url); //specify your URL
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); //disable follow redirects
        $http_data = curl_exec($ch); //hit the $url
        $curl_info = curl_getinfo($ch);
        return $curl_info['redirect_url'];// extract final url
    }
    ?>
    

    根据您的用例,您甚至可以使用CURLINFO_REDIRECT_URLCURLINFO_EFFECTIVE_URL。参考here

    <?php
        echo get_rurl("xurl");
        //echo get_rurl("yurl");
        function get_rurl($url){
            // initialize cURL
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url); //specify your URL
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); //disable follow redirects
            $http_data = curl_exec($ch); //hit the $url
            return curl_getinfo($ch, CURLINFO_REDIRECT_URL);
        }
    ?>
    

    希望这对其他用户也有帮助。

    【讨论】:

      【解决方案2】:

      根据 libcurl (https://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html) 的文档,这与使用 CURLOPT_FOLLOWLOCATION =&gt; true, 时的预期完全一样。您可能希望将其更改为 false。

      【讨论】:

      • 必须为“true”,这将遵循重定向以获得最终 URL
      • 但您不想想要跟随重定向。您想获取重定向网址。
      • 请尝试执行以上代码。通过将其设置为 false,将无法正常工作。我的意思是说,如果我们跟随位置,那么只有我们会得到最终/最后有效的 url。
      • 没错。您将无法请求 CURLINFO_EFFECTIVE_URL,但您能够访问响应标头。其中将包含一个Location: ... 标头,其中包含重定向网址:)
      猜你喜欢
      • 1970-01-01
      • 2011-03-05
      • 2012-07-13
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 2016-04-03
      • 2012-10-26
      相关资源
      最近更新 更多