使用函数for condition停止PHP while循环

使用函数for condition停止PHP while循环,php,while-loop,infinite-loop,Php,While Loop,Infinite Loop,我正在使用以下函数从一系列重定向中获取最终URL 它在99.8%的时间里工作得很好。我真的不能指出异常,但我相信这与另一端的服务器为每次访问生成一个新的随机URL有关。因此,该脚本陷入无限循环中 要复制此问题,请将get\u redirect\u url函数替换为 function get_redirect_url($url){ return $url.'x'; } 问题 如何设置时间或迭代限制 我觉得我什么都试过了。我尝试在while循环中设置一个基于时间的条件来查找下一个URL,

我正在使用以下函数从一系列重定向中获取最终URL

它在99.8%的时间里工作得很好。我真的不能指出异常,但我相信这与另一端的服务器为每次访问生成一个新的随机URL有关。因此,该脚本陷入无限循环中

要复制此问题,请将
get\u redirect\u 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;
}
函数获取所有重定向($url){
$redirects=array();
$start=time();
while($newurl=get\u redirect\u url($url)&&time()-$start<10){
if(在数组中($newurl,$redirects)){
打破
}
$redirects[]=$newurl;
$url=$newurl;
}
返回$redirects;
}
我也试着像这样计算迭代次数

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;
}
函数获取所有重定向($url){
$redirects=array();
$i=0;
而($newurl=get\u redirect\u url($url)&&$i<10){
if(在数组中($newurl,$redirects)){
打破
}
$redirects[]=$newurl;
$url=$newurl;
$i++;
}
返回$redirects;
}
上面的例子只是许多失败尝试中的两个。我准备好寻求帮助了。提前感谢。

只需扫描(一秒钟),您的代码不会显示任何明显的问题,但我想提出一些建议

每当我在控制流语句中看到使用赋值结果的条件时,它总是有一种可疑的味道(好吧,可以说这不是我的风格):


我敢打赌,通过拉出该赋值/条件或任何你想调用它的东西,你的代码将变得更可读、更易于维护,并且很有可能修复你所看到的问题。

我假设,你所说的循环是一个真正的循环,因此迭代将不起作用,因为如果url已经在数组中,这里的中断会在递增之前中断

if (in_array($newurl, $redirects)){
    break;
}
我不知道定时器为什么不工作。但是通过把
$i++至少可以改善您的情况。

此时存在一个问题:


相反,因为
&&
的优先级高于
=
。否则,
$newurl
将获取条件表达式的结果
get\u redirect\u url($url)&&time()-$start<10
,即
1

您的计数迭代代码应该可以工作。尝试回显$i.
查看为什么它没有完成。
while ( ($newurl = get_redirect_url($url)) && time()-$start < 10 )