[英]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_URL
或CURLINFO_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.