2013-02-27 5 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 –

+0

Разве информация недоступна в обратном направлении? [php debug_backtrace] (http://php.net/manual/en/function.debug-backtrace.php) –

+0

Вы должны действительно попросить оператора удаленного сервера улучшить свое время безотказной работы ... – pixelistik

ответ

0

header может использоваться только для одноразовых переадресаций. Поскольку нет возвращаемого значения, вы не можете проверить его таким образом. Вы должны сначала попробовать с JSON, чтобы проверить, есть ли ответ с сайта, если да, перенаправите пользователя, иначе напишите сообщение об ошибке или еще что-нибудь.

Reference for JSON

Я не использовал это лично, но видел это делают другие успешно с этим методом.

+0

Спасибо, но скрипт находится на а не на стороне клиента. Да, это будет легко с помощью javascript. Я не пробовал в PHP. – Woppi

+0

Сделайте это так: когда пользователь отправляет форму мгновенно, возвращает false с помощью js, то в том же случае проверьте с JSON, если другой сайт доступен, если он возвращает true. После этого будет отправлена ​​форма, и PHP сделает все остальное. Поэтому в основном перед отправкой вы проверяете наличие. – PeterInvincible

+0

Привет, да через js это можно сделать, но дело не просто в форме, а в PHP, это API-интерфейсы, сообщающиеся друг с другом на стороне сервера. Спасибо, что нашли время. Я ценю это.:) – Woppi

1

Как уже указывалось, header() просто запускает HTTP-заголовок и забывает, поэтому с PHP вы не сможете легко реализовать механизм повтора.

Но какова основная проблема, которую вы пытаетесь исправить? Если веб-сайт партнера, который вы перенаправляете на , настолько перегружен, что он иногда реагирует только на 2-ю или 3-ю попытку: серьезно, вы должны сделать этот сервер более надежным.

С другой стороны, если вы просто ищете способ для , обратите внимание на возможное время простоя другого сервера и сообщите об этом своим пользователям, вы можете добавить быструю проверку сервера на сервер. Если другой сервер не работает, вы можете перенаправить на другую страницу и извиниться или предложить ссылку повторной попытки.

Посмотрите на 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

Благодарим вас за идею опроса удаленного сервера перед перенаправлением. Я также применим его. Я придумал другое решение, в котором я могу применить повторную попытку. Это значит, что на сайте нашего клиента будет отображаться «уведомительный URL-адрес», который будет передавать те же данные, что и в возвращаемом URL-адресе, а затем перенаправить на возвращаемый URL-адрес. Хмммм, это единственный способ, который я знаю прямо сейчас, который может повторить попытку ... Как вы думаете, это может также как-то устранить частые проблемы с таймаутом сети? – Woppi

Смежные вопросы