我很苦惱這個問題:我有一個網絡接口,使用套接字連接到在某些路由器板上運行的各種C程序。每次C應用程序通過套接字發送一些東西時,PHP應用程序都會收到它。 一切都適用於一次性請求,但有一種情況是我需要在每次C應用程序發送更新時更新瀏覽器上的接口,直到它結束其任務。我可以通過對處理與C應用程序的通信的PHP腳本的jQuery.ajax調用成功啓動該過程,並且在每次更新之後,我已經設法將XMLHttpRequestProgressEvent
發送回客戶端,方法是將某些內容寫入PHP輸出緩衝區並在每次腳本通過它向C應用程序打開的套接字接收到某個東西時清空它。事情是,我想向XMLHttpRequestProgressEvent
添加一些有意義的數據,我可以通過檢查它看到target
和srcTarget
屬性爲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
,total
和loaded
值。很公平。我還是希望能夠設置各自的價值:)
感謝您的建議是有用的,但代碼將走量重寫所有Node.js中的服務器代碼是不值得的。 – juandemarco 2013-06-10 14:40:55