【问题标题】:PHP Detect if url redirects and retry redirectionPHP检测url是否重定向并重试重定向
【发布时间】:2013-02-13 00:11:45
【问题描述】:

我想在我的服务器上完成处理后将用户重定向到远程服务器。有时,由于用户端的网络连接超时,重定向没有发生,导致他/她的页面没有更新状态。

我目前使用的是

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,我会感到困惑,如果我还实现了 header,它会双重重定向......或者我误解了它?

非常感谢!

【问题讨论】:

标签: php curl http-headers http-redirect


【解决方案1】:

正如已经指出的那样,header() 只会触发 HTTP 标头并忘记,因此使用 PHP 您将无法轻松实现重试机制。

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

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

查看 this answer 以了解如何 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;
}

【讨论】:

  • 感谢您在重定向之前先 ping 远程服务器的想法。我也会应用它。我想出了另一个解决方案,我可以在其中应用重试。那就是在我们客户的站点上实现一个“通知 url”,它将传递与返回 url 中相同的数据,然后在完成后重定向到返回 url。嗯,这是我现在知道的唯一可以重试的方法……你认为它还能以某种方式消除频繁的网络超时问题吗?
【解决方案2】:

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

Reference for JSON

我个人没用过,但是看到别人用这个方法成功了。

【讨论】:

  • 谢谢,但脚本在服务器端,而不是在客户端。是的,通过javascript很容易。我没有在 PHP 中尝试过。
  • 这样做:当用户提交表单时立即用js返回false,然后在同一事件中检查其他站点是否可用,如果它返回true。在此之后,表单将被提交,其余的将由 PHP 完成。所以基本上在提交之前检查可用性。
  • 您好,是的,可以通过 js 完成,但是这种情况不仅仅是 PHP 的简单形式,它是服务器端相互通信的 API。不过感谢您抽出时间。我很感激。 :)
猜你喜欢
  • 1970-01-01
  • 2020-05-28
  • 2017-09-22
  • 2013-10-19
  • 2015-02-04
  • 1970-01-01
  • 2017-05-07
  • 2012-07-14
  • 1970-01-01
相关资源
最近更新 更多