用for condition函数停止PHP while循环


Stop a PHP while loop with function for condition

我使用以下函数从一系列重定向中获取最终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;
}

上面的例子只是许多失败尝试中的两个。我准备好求助了。

只是扫描(一秒钟)你的代码没有显示任何明显的问题,但我想提出一些建议。

每当我在控制流语句中看到使用赋值结果的条件时,它总是闻起来很可疑(好吧,让我们说这不是我的风格):

while ($newurl = get_redirect_url($url) ...

我敢打赌,通过抽取这个赋值/条件或任何你想叫它的东西,你的代码将变得更可读和可维护,并且很有可能解决你所看到的问题。

我假设,你正在谈论的循环是一个真正的循环,因此迭代不会工作,因为这里的break在递增之前中断,如果url已经在数组中。

if (in_array($newurl, $redirects)){
    break;
}
为什么定时器不工作,我不知道。但是,通过将$i++;放在循环的顶部来固定增量,至少可以改善您的情况。

有问题:

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