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

时间:2017-01-09 10:27:26

标签: php url redirect curl

下面的代码片段是使用cURL从重定向网址获取最终的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(),因为我只想从指定的重定向网址获取最终网址。

简而言之 - 如何从重定向网址获取最终网址而不下载结果。

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

2 个答案:

答案 0 :(得分:1)

这适用于CURLINFO_EFFECTIVE_URL,但对于它,选项CURLOPT_FOLLOWLOCATION必须设置为TRUE。这是基于CURLINFO_EFFECTIVE_URL正好返回它所说的内容,即最终加载的有效URL。如果CURLOPT_FOLLOWLOCATION=False那么有效网址将被请求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);
    }
?>

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

答案 1 :(得分:0)

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