服务器重新启动时显示等待页面

时间:2016-03-15 09:20:51

标签: javascript php jquery ajax

我有一台服务器并为其创建一个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;
&#13;
&#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,但这不是一个好的解决方案,因为需要运气,如果时间不够等等。

8 个答案:

答案 0 :(得分:6)

让我们总结一下代码中的问题:

  • 您需要使用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;
        }
    });
}

答案 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同步进行调用)。
  • 请不要在代码中使用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);
                }
            }
        }
    );  
}

答案 5 :(得分:0)

这可能会有所帮助,因为它最接近你可以用JS做的ping: https://github.com/jdfreder/pingjs

将后备用作递归午餐的部分,并注意不要在第一部分中重定向到快速。

答案 6 :(得分:0)

您的ping函数需要同步:ajax请求中的参数async: false

根据您提出的异步请求,您永远不会输入条件if ($ret === false),因此无法进行递归调用。

此外,在successerror回调中返回值不会使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();
            }
        }
    );
}