2013-02-27 85 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