2013-03-13 117 views
3

我使用下面的函数获取从一系列重定向的URL最终函数循环...停止PHP,而与条件

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

以上事例只是众多的2失败的尝试。我已经准备好寻求帮助。提前致谢。

+0

你的计数interations代码应该工作。试试'echo $ i。'
';'看看为什么它没有完成。 – Ranty 2013-03-13 08:53:04

回答

1

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

每当我看到条件语句中使用它总是闻腥的分配结果的控制流语句(好吧,让说,它不是我的风格):

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

我可以打赌,通过猛拉那项任务/条件或任何你想调用它,你的代码将变得更具可读性和可维护性,并通过一些快乐的机会解决你所看到的问题。

1

我假设,你所说的循环是一个真正的循环,因此迭代不起作用,因为如果URL已经在数组中,则在增加之前断开这里休息。

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

为什么计时器不工作,我不知道。但通过将$i++;置于循环的顶部来固定增量应至少改善您的情况。

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