2013-05-10 22 views
2

我很苦惱這個問題:我有一個網絡接口,使用套接字連接到在某些路由器板上運行的各種C程序。每次C應用程序通過套接字發送一些東西時,PHP應用程序都會收到它。 一切都適用於一次性請求,但有一種情況是我需要在每次C應用程序發送更新時更新瀏覽器上的接口,直到它結束其任務。我可以通過對處理與C應用程序的通信的PHP腳本的jQuery.ajax調用成功啓動該過程,並且在每次更新之後,我已經設法將XMLHttpRequestProgressEvent發送回客戶端,方法是將某些內容寫入PHP輸出緩衝區並在每次腳本通過它向C應用程序打開的套接字接收到某個東西時清空它。事情是,我想向XMLHttpRequestProgressEvent添加一些有意義的數據,我可以通過檢查它看到targetsrcTarget屬性爲XMLHttpRequest s。我以爲responseText其中一個將是緩衝區的內容,但事實並非如此。XMLHttpRequestProgressEvent從PHP操作

所以我的問題是:我如何封裝來自PHP的XMLHttpRequestProgressEvent中的數據,並且有沒有比使用flush發送該事件更好的方法?

一些代碼:

Ç

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處理進度事件)

UPDATE根據W3C specification一個親gress事件只能有lengthComputable,totalloaded值。很公平。我還是希望能夠設置各自的價值:)

回答

-1

Node.js的嘗試也許可以爲你

+0

感謝您的建議是有用的,但代碼將走量重寫所有Node.js中的服務器代碼是不值得的。 – juandemarco 2013-06-10 14:40:55