我正在努力解决这个问题:我有一个 Web 界面,它使用套接字连接到某些路由器板上运行的各种 C 程序。每次 C 应用程序通过套接字发送内容时,PHP 应用程序都会接收到它。
对于一次性请求,一切都完美无缺,但有一种情况,每次 C 应用程序发送更新时,我都需要更新浏览器上的界面,直到它结束其任务。我可以通过对处理与 C 应用程序通信的 PHP 脚本使用 jQuery.ajax 调用来成功启动该过程,并且我已经设法在每次更新后将 XMLHttpRequestProgressEvent
发送回客户端每次脚本通过它向 C 应用程序打开的套接字接收到一些东西时,向 PHP 输出缓冲区写入一些东西并刷新它。事情是,我想向 XMLHttpRequestProgressEvent
添加一些有意义的数据,通过检查它我可以看到它同时具有 target
和 srcTarget
属于 XMLHttpRequest
的属性。我认为其中之一的 responseText
将是缓冲区的内容,但事实并非如此。
所以我的问题是:如何将数据封装在 PHP 的 XMLHttpRequestProgressEvent
中,是否有比使用 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 specification进度事件只能有 lengthComputable
、total
和 loaded
值。很公平。我仍然希望能够设置它们各自的值:)
最佳答案
试试 Node.js 也许它对你有用
关于php - 来自 PHP 的 XMLHttpRequestProgressEvent 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16483409/