【问题标题】:Calculating big task with response for each executed step计算每个执行步骤的响应的大任务
【发布时间】:2014-06-18 18:48:08
【问题描述】:

抱歉,如果该主题已经存在,但我找不到解决方案。我在服务器端处理了一些计算。这些计算包括几个步骤。我想对每个执行的步骤做出响应。例如,一个任务有 5 个步骤,服务器必须向我发送 5 个响应:

  • 执行第 1 步
  • 执行第 2 步
  • 执行第 3 步
  • ...等

我阅读了很多论坛和博客,但我无法解决这个问题。就我而言,我认为在彗星中使用长轮询会更好。我写了一个简单的任务示例(发布在下面);它不起作用。这个任务有按钮启动计数器(从 1 到 11,睡眠 1 秒),然后 Ajax 发送请求。服务器必须给出累积的文本($q_msg),清除这个变量,并继续累积另一个计数。但不是这样,服务器会在没有任何响应的情况下累积所有内容,并最终将响应全部放在答案中。那么,我的错在哪里?请帮帮我。

HTML:

        <script type="text/javascript">
        var request;
        function createXMLRequest() {
            request = new XMLHttpRequest();
            return request;
        }

        //start counter
        function comet_btnStart() {
            document.getElementById('count1').innerHTML = "";
            createXMLRequest();
            var param = "btnStart=pusk";
            request.open("GET", "counter.php?" + param, true);
            request.onreadystatechange = comet_response;
            request.send(null);
        }

        //get values
        var q = "";
        function comet() {                
            createXMLRequest();
            var param = "q=" + q;
            request.open("GET", "counter.php?" + param, true);
            request.onreadystatechange = comet_response;
            request.send(null);
        }

        function comet_response() {
            if (request.readyState === 4)
            {
                if (request.status === 200)
                {
                    if (request.responseText !== null)
                    {
                        var text = request.responseText;
                        if (text === "end") document.getElementById('count1').innerHTML += "<br/>Task is executed";
                        else 
                        {
                            var result = text.split(",");
                            q = result[result.length-1];
                            document.getElementById('count1').innerHTML += "<br/>" + request.responseText;
                            setTimeout(comet, 2000);
                        }
                    }
                    else document.getElementById('count1').innerHTML += "<br/>No response";
                }
                else document.getElementById('count1').innerHTML += "<br/>Invalid connection";
            }
        }
    </script>
</head>
<body>
    <div>
        Click button to start counter: <input type="button" value="Начать" name="btnStart" id="btnStart" onclick="comet_btnStart()"  /><br/><br/>
        Counts:<br/> <span id='count1' style='color: #246499; font-weight: bold'></span>
    </div>
</body>



PHP:

<?php
if (isset($_GET['btnStart']))
{
    $q_msg = "";
    $q = 0;
    logic::counter();

    echo $q_msg;
    $q_msg = "";
}

if (isset($_GET['q']))
{
    $lastq = $_GET['q'];
    global $q;
    if ($lastq < $q)
    {
    echo $q_msg;
        $q_msg = "";
    }
    else echo "end";
}

class logic
{    
    static function counter() 
    {
        global $q;
    while ($q <= 10)
    {
        sleep(1);
        $q++;
        global $q_msg;
        if (strlen($q_msg) > 0) $q_msg .= ", " . $q; 
        else $q_msg = $q; 
        //just for debugging
        echo $q_msg; //why server doesn't send data???
    }
    }    
}

【问题讨论】:

    标签: javascript php comet long-integer polling


    【解决方案1】:
    $msc=microtime(true);
    

    //执行代码

    $msc=microtime(true)-$msc;
    echo $msc.' seconds'; // in seconds
    echo ($msc*1000).' milliseconds'; // in millseconds
    

    我不知道这是否是您正在寻找的。但如果我理解正确,这就是你要找的。你可以在这里阅读更多内容How to get the execution time of a MySQL query from PHP?

    感谢克里斯蒂安

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      • 2017-01-24
      • 1970-01-01
      相关资源
      最近更新 更多