如果我在php页面中运行此代码,我会在网页上将输出作为单独的行。生成输出时显示每一行。这很好,是我的预期。
do.php
$order = array("\r\n", "\n", "\r");
$a = popen('rsyncd -Pav remote.server.com::files/file1.tar.gz localfile.tar.gz', 'r');
while($b = fgets($a, 64)) {
ob_flush();flush();
$update = str_replace($order,'<br />', $b);
echo $update;
ob_flush();flush();
}
pclose($a);
有什么办法可以通过点击按钮调用它并将输出写入DIV。理想情况下,当输出每一行时,它会覆盖DIV中的前一行。 (所以DIV只包含一行,并且不断更新。)
我试过这个:
<script type="text/javascript">
$(document).ready(function() {
$.ajaxSetup({ cache: false });
$("#btn").click(function () {
$("#log").load("do.php");
});
});
</script>
<button id="btn">GO</button>
<div id="log" class="log"></div>
这样可行,但我只能一次性获得所有输出,而不是每次都覆盖上一行。
我假设我需要使用ajax调用,但是如何在生成时获取每一行输出?
由于
更新
谢谢 - 我已经按照其中一个链接提供了建议,我收到了一些实时数据,但它不是纯文本。 -
在纯文本中应该是:
receiving file list ...
1 file to consider
wrote 102 bytes read 119 bytes 442.00 bytes/sec
total size is 71424169 speedup is 323186.29
我得到的是:
receiving file list ... <br />2����+$��g��A���
*/�/IU040RH�,I-VP(JMLQ04���
M����!<���d�6��
*�/I�Q(άJU�,V0741214�TP(.HMM)- Z��YBt��ⲷ��<ũ٢
无论如何要把它作为纯文本。 ?
这是我测试的代码:
<script type="text/javascript">
var last_response_len = false;
$.ajax('./flushed-ajax.php', {
xhrFields: {
onprogress: function(e)
{
var this_response, response = e.currentTarget.response;
if(last_response_len === false)
{
this_response = response;
last_response_len = response.length;
}
else
{
this_response = response.substring(last_response_len);
last_response_len = response.length;
}
console.log(this_response);
}
}
})
.done(function(data)
{
console.log('Complete response = ' + data);
})
.fail(function(data)
{
console.log('Error: ', data);
});
console.log('Request Sent');
</script>