2

我正在努力解决这个问题:我有一个 Web 界面,它使用套接字连接到在某些路由器板上运行的各种 C 程序。每次 C 应用程序通过套接字发送一些东西时,PHP 应用程序都会接收它。一切都非常适合一次性请求,但是有一种情况,每次 C 应用程序发送更新时,我都需要更新浏览器上的界面,直到它结束其任务。我可以通过对处理与 C 应用程序通信的 PHP 脚本的 jQuery.ajax 调用来成功启动该过程,并且我已经成功地发送了一个XMLHttpRequestProgressEvent每次更新后通过向 PHP 输出缓冲区写入内容并在每次脚本通过它向 C 应用程序打开的套接字接收到内容时刷新它来返回客户端。问题是,我想向 中添加一些有意义的数据XMLHttpRequestProgressEvent,通过检查它可以看到它同时具有 atarget和 a 的srcTarget属性XMLHttpRequest。我认为responseText其中之一将是缓冲区的内容,但事实并非如此。

所以我的问题是:如何将数据封装在XMLHttpRequestProgressEventfrom 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规范,进度事件只能具有lengthComputabletotalloaded值。很公平。我仍然希望能够设置它们各自的值:)

4

1 回答 1

-1

试试 Node.js 也许它对你有用

于 2013-06-10T14:02:16.393 回答