我正在努力解决这个问题:我有一个 Web 界面,它使用套接字连接到在某些路由器板上运行的各种 C 程序。每次 C 应用程序通过套接字发送一些东西时,PHP 应用程序都会接收它。一切都非常适合一次性请求,但是有一种情况,每次 C 应用程序发送更新时,我都需要更新浏览器上的界面,直到它结束其任务。我可以通过对处理与 C 应用程序通信的 PHP 脚本的 jQuery.ajax 调用来成功启动该过程,并且我已经成功地发送了一个XMLHttpRequestProgressEvent
每次更新后通过向 PHP 输出缓冲区写入内容并在每次脚本通过它向 C 应用程序打开的套接字接收到内容时刷新它来返回客户端。问题是,我想向 中添加一些有意义的数据XMLHttpRequestProgressEvent
,通过检查它可以看到它同时具有 atarget
和 a 的srcTarget
属性XMLHttpRequest
。我认为responseText
其中之一将是缓冲区的内容,但事实并非如此。
所以我的问题是:如何将数据封装在XMLHttpRequestProgressEvent
from PHP 中,有没有比使用 flush 发送该事件更好的方法?
一些代码:
C
pipe = popen(command, "r");
while(!feof(pipe)) {
if(fgets(buffer, 128, pipe) != NULL)
printf("%s\n", buffer);
tcp_send(currentHandler, buffer);
}
pclose(pipe);
(是的,我实际上执行了另一个进程并将输出发回,至少现在是这样)。
PHP
$done = false;
while(!$done) {
$buffer = socket_read($socket, 128);
if (!$buffer || $buffer == "")
$done = true;
// I'd like to send back the value of $buffer as well!
echo ".";
flush();
}
JavaScript
$.ajax({
url: 'myScript.php',
type: 'post',
dataType: 'json',
data: {action: 'runTest', ajax: true},
success: function(data, status, xhr) {
console.log('Aye!');
},
progress: function(e) {
console.log(e);
},
error: function(xhr) {
console.log('Nay!');
console.log(xhr);
}
});
(当然我扩展了 jQuery.ajax 来处理进度事件)
更新根据 W3C规范,进度事件只能具有lengthComputable
、total
和loaded
值。很公平。我仍然希望能够设置它们各自的值:)