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 您将无法轻松实现重试机制。

但是,您要解决的根本问题是什么?如果您要重定向到的合作伙伴网站过载,以至于有时只会在第二次或第三次尝试时做出反应:严重的是,您应该使该服务器更可靠地工作。

另一方面,如果您只是在寻找一种方法来发现其他服务器可能的停机时间并相应地通知您的用户,您可以在代码中添加快速的服务器到服务器检查。如果其他服务器出现故障,您可以重定向到不同的页面并道歉或提供重试链接。

查看此答案以了解如何 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

header只能用于一次性重定向。由于没有返回值,所以不能这样检查。您应该首先尝试使用JSON来检查站点是否有响应,如果是,则重定向用户,否则编写错误消息或其他内容。

JSON 参考

我没有亲自使用过,但看到其他人用这种方法成功地做到了。

于 2013-02-27T09:02:04.863 回答