我有一台服务器并为其创建一个Web界面,如果用户按下页面上的重启按钮,那么用户将被重定向到reboot.php
,在那里他应该看到一个微调器gif直到服务器是再次可达,服务器通过shell执行重新启动。如果服务器可以访问,那么我需要重定向到main.php
所以我创建了以下功能。该函数以5秒的超时开始,否则它会立即加载main.php
,因为reboot命令会花费时间。
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;
}
}
);
}
<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://www.securenet.com/sites/default/files/spinner.gif" alt="spinner gif"></center>
</div>
</center>
</div>
</div>
&#13;
ajax.php
$cmd = filter_input(INPUT_POST, "cmd");
if ( isset( $cmd ) && $cmd == "check_online_status" )
{
echo "true";
}
在我的ajax.php
中,我只需返回&#34; true&#34;如果通话成功。
但是,我的逻辑不起作用,似乎我的代码只尝试对我的ajax.php
进行一次调用,然后再也没有尝试,我在控制台中得到net::ERR_CONNECTION_REFUSED
。
我在代码中添加了很多提醒,但是它们没有被执行,所以我想它在获取ajax.php
后第二次不会尝试拨打net::ERR_CONNECTION_REFUSED
。
我唯一的想法是等待足够的时间,然后重定向到main.php
,但这不是一个好的解决方案,因为需要运气,如果时间不够等等。
答案 0 :(得分:6)
让我们总结一下代码中的问题:
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;
}
});
}
答案 1 :(得分:1)
@EdwardBlack fisrt你必须将.gif图像添加到具有id的图像标签然后在该图像标签中传递style =“display:none”
<img id="imgid" src="" style="display:none">
function ping(url) {
$.ajax({
url: url,
beforeSend : function(){
$('#imgid').css({'display':'block'}); //or
$('#imgid').css('display', 'block'); // any one
},
success: function() {
alert('reply');
return true;
},
error: function() {
alert('timeout/error');
return false;
}
});
}
答案 2 :(得分:0)
如果服务器正在重新启动,通常您需要在应用程序服务器(在本例中为OpenERP)前面使用某种故障转移IP或至少一个缓存代理来告诉用户它下。否则,当服务器处于脱机状态时,您只会收到返回给客户端的通用浏览器错误消息,例如&#34;找不到服务器&#34;或类似的。
简而言之,执行此操作的最佳方法是在应用程序服务器前面放置另一个物理/虚拟服务器,该服务器始终是&#34; up(或者是一组独立重新启动的服务器),这样你就可以解析域名,或者如果由于崩溃或重新启动导致主服务器关闭,你可以故障转移到备份。
希望有所帮助
答案 3 :(得分:0)
setTimeout 仅运行一次
的功能您可以使用 setInterval 代替setTimeout
答案 4 :(得分:0)
此代码应该有效。我做了什么:
setInterval
代替setTimeout
每x秒执行ping
- 函数。 $.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);
}
}
}
);
}
答案 5 :(得分:0)
这可能会有所帮助,因为它最接近你可以用JS做的ping: https://github.com/jdfreder/pingjs
将后备用作递归午餐的部分,并注意不要在第一部分中重定向到快速。
答案 6 :(得分:0)
您的ping
函数需要同步:ajax请求中的参数async: false
。
根据您提出的异步请求,您永远不会输入条件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;
}
答案 7 :(得分:0)
您无法以ping
的方式返回同步 - 如果使用调试器检查值,则测试函数中的返回值始终为undefined
。原因是$.ajax
不是同步调用。
在构建javascript时,你不应该(糟糕的风格)依赖同步apis,所以需要考虑如何使用异步模式来做同样的事情。
如需进一步阅读,请查看以下问题:How do I return the response from an asynchronous call?
重写代码以使用异步模式,类似这样;
$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();
}
}
);
}