PHP中持久功能的进度条

时间:2017-05-30 19:06:10

标签: javascript php server-sent-events

我正在寻找任何合理的方式来展示从网络浏览器在PHP中实现的服务器上的一些持久功能的进展。

最近,我发现this guide使用服务器端事件并且它运行良好,但只有在很短的时间内我生成了大量的消息。如果我尝试使用相同的工作解决方案来减少更长时间的步骤,那么浏览器几乎不会更新。

PHP函数模拟丢失持久操作:

$big_number = 10000;
while ($i < $big_number) {
    usleep(200);
    sendMsg(++$i, "", $i/$big_number*100);
}

JavaScript函数EventSource.onmessage()在浏览器中登录:(按预期工作)

20:53:47 started, calling server
20:53:47 first message from server
20:54:01 last message

导致几乎即时更新进度条并感觉良好,但更改值(而不是10000个快速操作只做几个长操作)会破坏所有内容,进度条会在从0%到100%之后立即进行< / p>

$big_number = 100;                       // <- changed from 10000 to 100 
while ($i < $big_number) {
    usleep(20000);                       // <- changed from 200 to 20000
    sendMsg(++$i, "", $i/$big_number*100);
}

JavaScript日志:(根本不更新进度条)

20:53:09 start
20:53:19 first message
20:53:20 last message

您认为问题在哪里,因为这些数字是我改变的唯一内容,它会完全摧毁应用程序?

编辑:简化的JavaScript更新进度条:

source = new EventSource(php_file);

source.addEventListener("message", function(e) {
    var result = JSON.parse(e.data);

    document.getElementById("myprogress").style.width = result.progress+"%";

    if(result.message == "TERMINATE") {
        source.close();
        document.getElementById("myprogressbar").style.display = "none";
    }
}, false);

EDIT2: 问题可能在于服务器端的缓冲(虽然我使用no-cache,flush和ob_flush),但是两个提到的套接字之间的交互仍然很奇怪(并且仍未解决)。

包含服务器时间的JavaScript日志(在usleep(20000)版本中):

23:19:34 start
23:19:45 firstMessage (server time 23:19:35)    
23:19:45 lasttMessage (server time 23:19:44)

0 个答案:

没有答案