3

次の関数を使用して、一連のリダイレクトから最終的な 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 つにすぎません。私は助けの準備ができています。前もって感謝します。

4

3 に答える 3

1

コードを (一瞬) スキャンするだけでは明らかな問題は見られませんが、いくつかの提案をしたいと思います。

制御フロー ステートメントで代入の結果を使用する条件文を見ると、いつも怪しい匂いがします (わかりました、私のスタイルではないとしましょう)。

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

その割り当て/条件またはそれを呼び出したいものをヤンクすることで、コードがより読みやすく、保守しやすくなり、発生している問題を修正できる可能性があります。

于 2013-03-13T08:54:32.650 に答える
1

あなたが話しているループは実際のループであるため、反復は機能しません。これは、URL が既に配列内にある場合、インクリメントする前にここで中断するためです。

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

タイマーが機能しない理由はわかりません。しかし、それをループの先頭に置いてインクリメントを修正すると$i++;、少なくとも状況が改善されるはずです。

于 2013-03-13T08:59:20.387 に答える
0

whileに問題があります:

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

いくつかの括弧を追加する必要があります$newurl = get_redirect_url($url)

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

代わりに、 since&&は よりも優先順位が高くなり=ます。そうでなければ$newurl、条件式の結果を取得しget_redirect_url($url) && time()-$start < 10ます1

于 2013-03-13T08:59:20.507 に答える