2013-02-27 87 views
1

我想在我的服务器上完成处理后将用户重定向到远程服务器。有时,由于用户端的网络连接超时,重定向不会发生,导致他/她的页面无法获得更新状态。PHP检测URL是否重定向并重试重定向

我目前使用的是什么

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,那么它会双重重定向,如果我也实现标题...或者我误解了它?

非常感谢!

+0

检查了这一点,也许它可以帮助http://stackoverflow.com/questions/2964834/php-check-if-url-redirects尤其答案这里http://stackoverflow.com/a/2965116/1202367 – 2013-02-27 08:58:37

+0

回溯信息不是可用的吗? [PHP的debug_backtrace](http://php.net/manual/en/function.debug-backtrace.php) – 2013-02-27 08:59:27

+0

你应该真的要求远程服务器运营商提高其正常运行时间... – pixelistik 2013-02-27 09:24:14

回答

0

header只能用于一次性重定向。由于没有返回值,因此无法以此方式进行检查。您应该首先尝试使用JSON来检查是否有来自站点的响应,如果是,请重定向用户,否则写入错误消息或其他内容。

Reference for JSON

我没有亲自使用这一点,但看到别人用这种方法做成功。

+0

谢谢,但脚本是在服务器端,而不是在客户端。是的,通过javascript很容易。我还没有尝试过PHP。 – Woppi 2013-02-27 09:06:23

+0

这样做:当用户提交表单时立即用js返回false,然后在同一事件中使用JSON检查,如果其他站点可用,则返回true。在此之后,表单将被提交,而PHP将完成剩下的工作。所以基本上在提交之前检查可用性。 – PeterInvincible 2013-02-27 09:21:36

+0

嗨,是的,通过js它可以做到,但案件不只是一个简单的形式,然后是PHP,它是与其他服务器端通信的API。感谢您花时间。我很感激。:) – Woppi 2013-02-28 00:47:25

1

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

但是,您正试图解决的底层问题是什么?如果您重定向到的合作伙伴网站超载,以至于它有时只会在第二次或第三次尝试上作出反应:认真地说,您应该使该服务器更可靠地工作。另一方面,如果您只是在寻找一种方法来注意可能的停机时间并且相应地通知您的用户,您可以在代码中添加一个快速的服务器到服务器检查。如果其他服务器关闭,您可以重定向到其他页面并道歉或提供重试链接。

查看this answer可以查看服务器是否已启动。

粗略的解决办法是这样的:

<?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; 
} 
+0

感谢您在重定向之前首先ping远程服务器的想法。我也会应用它。我想出了另一个可以应用重试的解决方案。这就是在我们客户的网站上实施一个“通知网址”,它将传递与返回网址相同的数据,然后重定向到完成后返回网址。嗯,这是我现在唯一知道的可以重试的方法......你认为它可以以某种方式消除频繁的网络超时问题吗? – Woppi 2013-02-28 00:54:48