我正在寻找任何合理的方式来展示从网络浏览器在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)