我正在使用以下函数从一系列重定向中获取最终的URL ...
https://stackoverflow.com/a/4102293/1183476
99.8%的时间效果很好。我无法确定异常,但我认为它与另一端的服务器有关,为每次访问生成一个新的随机URL。因此,这个脚本陷入无限循环。
要复制该问题,请将get_redirect_url
函数替换为...
function get_redirect_url($url){
return $url.'x';
}
问题
如何设置时间或迭代限制?
我觉得我已经尝试了一切。我尝试在while循环中设置一个基于时间的条件,寻找下一个URL,但它不起作用,我不知道为什么。像这样......
function get_all_redirects($url){
$redirects = array();
$start = time();
while ($newurl = get_redirect_url($url) && time()-$start < 10 ){
if (in_array($newurl, $redirects)){
break;
}
$redirects[] = $newurl;
$url = $newurl;
}
return $redirects;
}
我也试过计算这样的迭代......
function get_all_redirects($url){
$redirects = array();
$i = 0;
while ($newurl = get_redirect_url($url) && $i < 10 ){
if (in_array($newurl, $redirects)){
break;
}
$redirects[] = $newurl;
$url = $newurl;
$i++;
}
return $redirects;
}
以上示例仅是许多失败尝试中的两个。我准备好了。提前谢谢。
答案 0 :(得分:1)
只是扫描(一秒钟)您的代码没有显示任何明显的问题,但我想提出一些建议。
每当我在控制流语句中看到使用赋值结果的条件时,它总是闻起来很腥(好吧,让我们说它不是我的风格):
while ($newurl = get_redirect_url($url) ...
我敢打赌,通过排除任务或条件或任何你想要它的代码,你的代码将变得更易读和可维护,并且通过一些快乐的机会来解决你所看到的问题。
答案 1 :(得分:1)
我假设,你所说的循环是一个真正的循环,因此迭代不起作用,因为如果url已经在数组中,则在递增之前断开这里。
if (in_array($newurl, $redirects)){
break;
}
为什么定时器不起作用,我不知道。但是通过将$i++;
放在循环的顶部来修复递增应该至少可以改善你的情况。
答案 2 :(得分:0)
时出现问题:
while ($newurl = get_redirect_url($url) && time()-$start < 10 )
并且应在$newurl = get_redirect_url($url)
while ( ($newurl = get_redirect_url($url)) && time()-$start < 10 )
相反,因为&&
的优先级高于=
。否则,$newurl
会获得条件表达式get_redirect_url($url) && time()-$start < 10
的结果1
。