조건

2013-03-13 2 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; 
} 

예제는 단지이 많은이 시도 실패입니다 ... 이런 식으로 반복 계산했습니다. 나는 도움을받을 준비가되어있다. 미리 감사드립니다.

+0

계산 간섭 코드가 작동해야합니다. 'echo $ i를 시도해보십시오.'
'; '왜 끝내지 않는지 확인하십시오. – Ranty

답변

1

코드를 스캔하면 (2 초 동안) 명백한 문제는 나타나지 않지만 몇 가지 제안을하고 싶습니다. 나는 항상 비린내 냄새 과제의 결과를 사용하여 제어 흐름 문에서 조건문을 볼 때마다

는 (좋아, 그 나의 스타일을 말할 수) :

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) 

&&=보다 높은 우선 순위를 가지고 있기 때문에, 대신

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

$newurl = get_redirect_url($url) 주위에 약간의 괄호는 추가해야합니다. 그렇지 않은 경우 $newurl은 조건부 표현 get_redirect_url($url) && time()-$start < 101 인 결과를 얻습니다.