3 votes

Arrêter une boucle while en PHP avec la fonction for condition

J'utilise les fonctions suivantes pour obtenir l'URL finale à partir d'une série de redirections...

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

Il fonctionne parfaitement dans 99,8 % des cas. Je ne peux pas vraiment identifier l'exception, mais je pense qu'elle a quelque chose à voir avec le fait que le serveur à l'autre bout génère une nouvelle URL aléatoire pour chaque visite. Ainsi, ce script reste bloqué dans une boucle infinie.

Pour reproduire le problème, remplacez le get_redirect_url fonction avec...

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

La question

Comment puis-je fixer une limite de temps ou d'itération ?

J'ai l'impression d'avoir tout essayé. J'ai essayé de mettre une condition temporelle dans la boucle while qui recherche la prochaine URL, mais cela ne fonctionne pas et je ne sais pas pourquoi. Comme ceci...

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

J'ai également essayé de compter les itérations comme suit...

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

Les exemples ci-dessus ne sont que deux des nombreuses tentatives qui ont échoué. Je suis prêt à recevoir de l'aide. Merci d'avance.

1voto

zaf Points 12350

Le simple fait d'analyser (pendant une seconde) votre code ne révèle aucun problème évident, mais j'aimerais faire quelques suggestions.

Chaque fois que je vois des conditionnelles dans des instructions de flux de contrôle qui utilisent le résultat d'une affectation, cela sent toujours le roussi (ok, disons que ce n'est pas mon style) :

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

Je peux parier qu'en supprimant cette affectation/condition ou autre, votre code deviendra plus lisible et plus facile à maintenir et que, par un heureux hasard, il résoudra le problème que vous rencontrez.

1voto

MildlySerious Points 5770

Je suppose que la boucle dont vous parlez est une vraie boucle, donc l'itération ne fonctionnerait pas, à cause du break qui s'interrompt avant d'incrémenter si l'url est déjà dans le tableau.

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

Je ne sais pas pourquoi la minuterie ne fonctionne pas. Mais en corrigeant l'incrémentation en mettant ce $i++; au début de la boucle devrait au moins améliorer votre situation.

0voto

ring0 Points 10346

Il y a un problème dans le alors que :

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

et des parenthèses devraient être ajoutées autour de $newurl = get_redirect_url($url)

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

au lieu de cela, puisque && a une priorité supérieure à celle de = . Autrement $newurl obtient le résultat de l'expression conditionnelle get_redirect_url($url) && time()-$start < 10 qui est 1 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X