У меня есть сервер и создаю для него веб-интерфейс, если пользователь нажимает кнопку перезагрузки на странице, тогда пользователь перенаправляется на 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
решение, потому что нужна удача, что, если времени было недостаточно и т. Д.
Давайте подведем итоги в вашем коде:
setInterval
для выполнения функции каждые x секунд Полученный код проще:
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 для синхронного вызова). 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; }