我希望实时读取一个文本文件,并在前端更新新添加的行。该文本文件保存了两个用户的日志数据。我已经尝试过一些方法来解决这个问题,但是无论是php脚本还是js都不能满足我的要求。
JS脚本
function ShowNewMessages(res, curr, end) {
// build the front end
var newdiv1 = "<div class=\"message\"> <div class=\"own-avatar-message\" style=\"background-image: url("+res[curr][4].replace(/\\\//g, "/")+");\"></div><div class=\"own-message2\"><div class=\"own-message\"><p>" + res[curr][3] +"</p></div><div class=\"message-timestamp\"> "+ res[curr][1] +" • "+res[curr][2] +"</div></div> </div>";
$( newdiv1 ).insertAfter( $( ".message" ).last());
var height = 0;
$('.message').each(function(i, value){
height += parseInt($(this).height());
});
height += '';
$('div').animate({scrollTop: height});
// check if there is another messsage or checkagain for new messages
curr++;
if (curr <= end) ShowNewMessages(res, curr, end);
else {setTimeout(function() {GetNewMesssages()}, 10000);}
}
function GetNewMesssages() {
$.ajax({
type:'POST',
url: "../lib/GetMesssage.php",
data: "friend=" + MsgFriend,
dataType: 'json',
async: false,
success:function(data){
// check error state
if (data[0] != "Error") {
var start = 0;
var end = data.length-1; // minus one for the new line
if (end > 0 ) ShowNewMessages(data, start, end-1);
else setTimeout(function() {GetNewMesssages()}, 10000);
}
else alert('some error message');
}
});
}
GetMesssage.php
<?php
session_start();
// get the requirements for the file name
$MyEmail = $_SESSION['login'];
$FriendEmail = $_POST['friend'];
if (strcmp($MyEmail, $FriendEmail) < 0) {
$FileName = $MyEmail.'-'.$FriendEmail.'.txt';
}
else {
$FileName = $FriendEmail.'-'.$MyEmail.'.txt';
}
$File = fopen('data/'.$FileName, "r") or die(json_encode(array_push($messages, "Error")));
// count the lines exist in the file
$count = 0;
while(!feof($File)){
$tmp = fgets($File);
$count++;
}
// if the session var that holds the offset position is not set
// or has value more than the lines of text file
if (!isset($_SESSION['pos']) || $_SESSION['pos'] >= $count) {
$_SESSION['pos'] = 0; // back to the beginning
}
// the array that holds the logs data
$messages = array();
// move the pointer to the current position
fseek($File, $_SESSION['pos']);
// read the file
while(!feof($File)){
$msg = fgets($File);
$msg1 = explode("<!@#@>", $msg);
array_push($messages, $msg1);
$_SESSION['pos']++;
}
// get the current offset position
//$_SESSION['pos'] = ftell($File);
// return the array
echo json_encode($messages);
fclose($File)
?>
解释
假设我们第一次调用GetNewMesssages()
函数时,例程开始运行。该函数将触发php并从文件中获取数据。
接下来,如果数据包含内容,则返回数组不为空,我们执行ShowNewMessages()
函数并更新前端。
完成后,我们启动另一个GetNewMesssages()
回调。
我的需求
我想每N秒检查一次文件是否有新添加的行,并更新我的前端。
问题
我在php和js脚本中都遇到了问题。我不想添加两个问题。
在PHP中
我没有找到如何使用ftell()
仅获取新添加的行。因为脚本的工作方式是这样的,在每次更新中我都会不断地将整个文件读入我的数组中。
在JS中
在JS中,我遇到了同步ajax调用的问题。也就是说,在每次调用GetNewMessages()
函数时,我会再次调用2-3次该函数。这与setTimeout()
有关,但我也找不到如何设置回调。
更新
我要读取的文本文件的示例:
line_id <BreakString> some data <BreakString> blah blah
another_line_id <BreakString> some_other data <BreakString> blah blah 2
注意:这并不代表任何意思,仅是将内容分割成数组。
更新 2
在收到版主的通知后,我将缩小我的问题范围,只是想找到保持结构的实时读取文件的最佳方法。