Показывать страницу ожидания при перезагрузке сервера

У меня есть сервер и создаю для него веб-интерфейс, если пользователь нажимает кнопку перезагрузки на странице, тогда пользователь перенаправляется на reboot.php где он должен видеть гиперссылку gif до тех пор, пока сервер не будет доступен снова, а сервер перезагружается через выполнение оболочки. Если сервер доступен, мне нужно перенаправить на main.php

Поэтому я создал следующую функцию. Функция начинается с таймаута в 5 секунд, потому что в противном случае она мгновенно загружает main.php потому что команда перезагрузки требует времени.

reboot.php

  $ret = false; test(); function test() { setTimeout ( function() { $ret = ping("www.google.de"); if ($ret === false) { test(); } else { window.location.href = "main.php"; } }, 3000 ); } function ping(url) { $.ajax ( { url: url, success: function(result) { alert('reply'); return true; }, error: function(result) { alert('timeout/error'); return false; } } ); } -  $ret = false; test(); function test() { setTimeout ( function() { $ret = ping("www.google.de"); if ($ret === false) { test(); } else { window.location.href = "main.php"; } }, 3000 ); } function ping(url) { $.ajax ( { url: url, success: function(result) { alert('reply'); return true; }, error: function(result) { alert('timeout/error'); return false; } } ); } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="col-lg-6 col-lg-offset-3" id="mydiv"> <div class="mydiv_inhalt"> <h2>Rebooting...</h2> <p>This can take about 2 minutes.</p> <center> <div class="waiting" id="waiting" style="margin-top:30px; margin-left: 0px;"> <center><img class="loading_table" src="http://img.ruphp.com/javascript/spinner.gif" alt="spinner gif"></center> </div> </center> </div> </div> 

ajax.php

 $cmd = filter_input(INPUT_POST, "cmd"); if ( isset( $cmd ) && $cmd == "check_online_status" ) { echo "true"; } 

В моем ajax.php я просто возвращаю «true», если вызов был успешным. Однако моя логика не работает, кажется, что мой код только пытается сделать один вызов моего ajax.php а затем никогда не пытается снова, и я получаю net::ERR_CONNECTION_REFUSED в консоли.

Я помещал много предупреждений в свой код, но они не выполняются, поэтому я думаю, что он не пытается вызывать ajax.php во второй раз после получения net::ERR_CONNECTION_REFUSED .

Моя единственная идея – подождать достаточно времени, а затем перенаправить на main.php , но это main.php решение, потому что нужна удача, что, если времени было недостаточно и т. Д.

Solutions Collecting From Web of "Показывать страницу ожидания при перезагрузке сервера"

Давайте подведем итоги в вашем коде:

  • вам нужно использовать setInterval для выполнения функции каждые x секунд
  • запрос ajax является асинхронным, и он должен оставаться таким. Вы не можете ожидать возвращаемого значения из обратного вызова, вместо этого вы должны действовать в обратном вызове

Полученный код проще:

 var pingUrl = "www.google.de"; var targetUrl = "main.php"; setInterval(ping, 3000); function ping() { $.ajax({ url: pingUrl, success: function(result) { window.location.href = targetUrl; } }); } 

@EdwardBlack fisrt вам нужно осмыслить .gif изображение к тегу изображения с идентификатором, тогда в теге с изображением вы должны передать style = "display: none"

 <img id="imgid" src="" style="display:none"> 

Если сервер перезагружается, обычно вам потребуется какой-то IP-адрес с отказоустойчивостью или, по крайней мере, кэширующий прокси-сервер перед сервером приложений (в данном случае OpenERP), чтобы сообщить пользователю, что он не работает. В противном случае, пока сервер отключен, вы получите только общее сообщение об ошибке браузера, которое будет возвращено клиенту, например «сервер не найден» или аналогичный.

Короче говоря, лучший способ сделать это – иметь еще один физический / виртуальный сервер, расположенный перед сервером приложений, который «всегда» (или кластер серверов, которые перезагружаются независимо), так что у вас всегда есть что-то, разрешающее доменное имя или может переходить к резервному копированию, если основной из-за сбоев или перезагрузки.

Надеюсь, поможет

setTimeout запускает функцию только один раз

вы можете использовать setInterval вместо setTimeout

Это может помочь, так как это самое близкое к ping, которое вы можете сделать с JS: https://github.com/jdfreder/pingjs

Используйте резервную копию в качестве рекурсивной части для повторного обеда и будьте осторожны, чтобы не перенаправить ее в первую часть.

Этот код должен работать. Что я наделал:

  • Используйте setInterval вместо setTimeout для выполнения функции ping каждые x секунд.
  • Функция $.post выполняется асинхронно (запрос ajax). Это означает, что вы не можете использовать цикл while, как вы это делали (кроме того, что вы устанавливаете jQuery для синхронного вызова).
  • Пожалуйста, не используйте Umlaute (äöü) в своем коде. Ничего хорошего из этого не выйдет.

 var timeoutCounter = 0; var interval = setInterval(function() { ping(10); }, 5000); function ping(maxTimeouts) { $.post( 'ajax.php', { cmd: "check_online_status" }, function(data, status) { if (status == "success") { window.location.href = 'main.php'; clearInterval(interval); } else { timeoutCounter++; if (timeoutCounter >= maxTimeouts) { alert("Max Timeouts ("+ maxTimeouts + ") exceeded!"); clearInterval(interval); } } } ); } 

Вы не можете вернуться синхронно из ping так, как вы это делаете – возвращаемое значение всегда undefined в тестовой функции, если вы проверяете значение с помощью отладчика. Причина в том, что $.ajax не является синхронным вызовом.

Вы не должны (плохой стиль) полагаться на синхронный apis при создании javascript, поэтому вам нужно подумать о том, как сделать то же самое с использованием шаблона async.

Для дальнейшего чтения посмотрите на этот вопрос: как вернуть ответ от асинхронного вызова?

Перепишите свой код, чтобы использовать шаблон async, что-то вроде этого;

 $ret = false; function rebooted(){ console.log("Reboot complete")}; test( rebooted ); function test(okcb) { setTimeout ( function() { ping("www.google.de", function(){ $ret=true; okcb(); }, function(){ test(okcb);} ); }, 3000 ); } function ping(url, yeah, nooo) { $.ajax ( { url: url, success: function(result) { console.log('reply'); yeah(); }, error: function(result) { console.log('timeout/error'); nooo(); } } ); } - $ret = false; function rebooted(){ console.log("Reboot complete")}; test( rebooted ); function test(okcb) { setTimeout ( function() { ping("www.google.de", function(){ $ret=true; okcb(); }, function(){ test(okcb);} ); }, 3000 ); } function ping(url, yeah, nooo) { $.ajax ( { url: url, success: function(result) { console.log('reply'); yeah(); }, error: function(result) { console.log('timeout/error'); nooo(); } } ); } 

Ваша функция ping должна быть синхронной: param async: false в запросе ajax.

С запросом асинхронного запроса вы никогда не вводите условие if ($ret === false) , поэтому рекурсивный вызов не может быть выполнен.

Кроме того, возврат значения в результате success или обратных вызовов error не приводит к тому, что функция ping возвращает требуемое значение.

Вы должны переписать свою функцию ping следующим образом:

 function ping(url) { var ret = false; $.ajax ( { async: false, url: url, success: function(result) { alert('reply'); ret = true; }, error: function(result) { alert('timeout/error'); ret = false; } } ); return ret; } - function ping(url) { var ret = false; $.ajax ( { async: false, url: url, success: function(result) { alert('reply'); ret = true; }, error: function(result) { alert('timeout/error'); ret = false; } } ); return ret; }