【问题标题】:Stop a PHP while loop with function for condition使用条件函数停止 PHP while 循环
【发布时间】:2023-04-01 15:38:01
【问题描述】:

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

https://stackoverflow.com/a/4102293/1183476

它在 99.8% 的时间里都很好用。我无法真正确定异常,但我相信它与另一端的服务器为每次访问生成一个新的随机 URL 有关。因此,该脚本陷入了无限循环。

要复制问题,请将 get_redirect_url 函数替换为...

function get_redirect_url($url){
    return $url.'x';
}

问题

如何设置时间或迭代限制?

我觉得我已经尝试了一切。我尝试在查找下一个 URL 的 while 循环中放置一个基于时间的条件,但它不起作用,我不知道为什么。像这样……

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;
}

以上示例只是众多失败尝试中的 2 次。我准备好寻求帮助了。提前致谢。

【问题讨论】:

  • 您的计数交互代码应该可以工作。试试echo $i.'&lt;br&gt;'; 看看为什么没有完成。

标签: php while-loop infinite-loop


【解决方案1】:

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

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

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

我敢打赌,通过取消该分配/条件或任何您想调用的名称,您的代码将变得更具可读性和可维护性,并且很高兴有机会解决您遇到的问题。

【讨论】:

    【解决方案2】:

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

    if (in_array($newurl, $redirects)){
        break;
    }
    

    为什么计时器不起作用,我不知道。但是通过将$i++; 放在循环顶部来修复增量至少应该可以改善您的情况。

    【讨论】:

      【解决方案3】:

      while有问题:

      while ($newurl = get_redirect_url($url) && time()-$start < 10 )
      

      并且应该在$newurl = get_redirect_url($url)周围添加一些括号

      while ( ($newurl = get_redirect_url($url)) && time()-$start < 10 )
      

      相反,因为&amp;&amp; 的优先级高于=。否则$newurl 得到条件表达式get_redirect_url($url) &amp;&amp; time()-$start &lt; 10 的结果,即1

      【讨论】:

        猜你喜欢
        • 2013-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-29
        • 2013-11-22
        相关资源
        最近更新 更多