1

サーバーで処理が完了した後、ユーザーをリモート サーバーにリダイレクトしたいと考えていました。ユーザー側でのネットワーク接続のタイムアウトが原因で、リダイレクトが行われず、ページが更新されないことがあります。

私が現在使っているのは

header('Location: http://anotherwebsite.com');

これが失敗した場合、再試行されません...「再試行する」ものを実装するにはどうすればよいですか

$retry_limit = 0;
while(//http status code not 301 or 302 && $retry_limit < 3)
{
    header('Location: http://anotherwebsite.com');

    $retry_limit++;
}

cURLを使用すると混乱し、ヘッダーも実装すると二重リダイレクトになります...または誤解したのでしょうか?

どうもありがとう!

4

2 に答える 2

1

指摘されているようにheader()、HTTP ヘッダーを起動して忘れるだけなので、PHP ではリトライ メカニズムを簡単に実装することはできません。

しかし、解決しようとしている根本的な問題は何ですか? リダイレクト先のパートナー Web サイトが過負荷で、2 回目または 3 回目の試行でしか反応しない場合があります。真剣に、そのサーバーをより確実に動作させる必要があります。

一方、他のサーバーのダウンタイムの可能性を通知し、それをユーザーに通知する方法を単に探している場合は、サーバー間のクイック チェックをコードに追加できます。他のサーバーがダウンしている場合は、別のページにリダイレクトして、謝罪するか、再試行リンクを提供できます。

サーバーが稼働しているかどうかを確認するためにサーバーに ping を送信する方法については、この回答を参照してください。

大まかな解決策は次のようになります。

<?php
$url = 'http://anotherwebsite.com';

if(pingDomain($url) != -1) {
    header('Location: ' . $url);
} else {
    header('Location: sorry_retry_later.html');
}

// Ping function, see
// https://tournasdimitrios1.wordpress.com/2010/10/15/check-your-server-status-a-basic-ping-with-php/
function pingDomain($domain){
    $starttime = microtime(true);
    $file      = fsockopen ($domain, 80, $errno, $errstr, 10);
    $stoptime  = microtime(true);
    $status    = 0;

    if (!$file) $status = -1;  // Site is down
    else {
        fclose($file);
        $status = ($stoptime - $starttime) * 1000;
        $status = floor($status);
    }
    return $status;
}
于 2013-02-27T09:34:01.167 に答える
0

header1 回限りのリダイレクトにのみ使用できます。戻り値がないので、この方法では確認できません。最初にJSONを使用して、サイトからの応答があるかどうかを確認する必要があります。応答がある場合はユーザーをリダイレクトし、そうでない場合はエラー メッセージなどを書き込みます。

JSON のリファレンス

私はこれを個人的に使用したことはありませんが、他の人がこの方法で成功するのを見てきました.

于 2013-02-27T09:02:04.863 に答える