繁体   English   中英

cURL 需要很长时间才能获得重定向 URL 的最终 URL

[英]cURL taking long time to get the final URL of redirect URL

下面的代码片段是使用 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。

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

这适用于CURLINFO_EFFECTIVE_URL ,但对于它,选项CURLOPT_FOLLOWLOCATION必须设置为TRUE 这是因为CURLINFO_EFFECTIVE_URL准确地返回它所说的内容,即最终加载的有效 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 参考这里

<?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);
    }
?>

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM