私はこの問題に苦しんでいます: 私はソケットを使用して、いくつかのルーターボードで実行されているさまざまな C プログラムに接続する Web インターフェイスを持っています。C アプリケーションがソケットを介して何かを送信するたびに、PHP アプリケーションはそれを受信します。ワンショット リクエストではすべてが完全に機能しますが、C アプリケーションが更新を送信するたびに、タスクが終了するまでブラウザーのインターフェイスを更新する必要がある場合が 1 つあります。C アプリケーションとの通信を処理する PHP スクリプトへの jQuery.ajax 呼び出しを使用して、プロセスを正常に開始できます。XMLHttpRequestProgressEvent
PHP 出力バッファに何かを書き込み、スクリプトが C アプリケーションに対して開いているソケットを介して何かを受信するたびにそれをフラッシュすることにより、各更新後にクライアントに戻します。つまり、意味のあるデータを に追加したいのですが、XMLHttpRequestProgressEvent
それを調べると、target
と のsrcTarget
プロパティの両方があることがわかりXMLHttpRequest
ます。responseText
そのうちの 1 つがバッファの内容になると思いましたが、そうではありません。
だから私の質問は次のとおりです: from 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);
}
});
(もちろん、progress イベントを処理するために jQuery.ajax を拡張しました)
更新W3C仕様によると、進捗イベントはlengthComputable
,total
およびloaded
値のみを持つことができます。けっこうだ。それぞれの値を設定できるようにしたいと思います:)