Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用PHP和Ajax实时读取文件_Javascript_Php_Jquery_Ajax - Fatal编程技术网

Javascript 如何使用PHP和Ajax实时读取文件

Javascript 如何使用PHP和Ajax实时读取文件,javascript,php,jquery,ajax,Javascript,Php,Jquery,Ajax,我想实时读取txt文件,并更新前端添加的新行。文本文件保存两个用户的日志数据。我已经尝试了一些方法来工作,但是php脚本和js都没有按照我想要的方式工作 JS脚本 function ShowNewMessages(res, curr, end) { // build the front end var newdiv1 = "<div class=\"message\"> <div class=\"own-avatar-message\" style=\"ba

我想实时读取txt文件,并更新前端添加的新行。文本文件保存两个用户的日志数据。我已经尝试了一些方法来工作,但是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');
            }
        });   
} 
注:这并不意味着什么。它只是将内容分离到数组中

更新2 在收到主持人的通知后,我将缩小我的问题,只想找出实时读取文件并保持结构的最佳方法。

PHP 在PHP中,设置指向文件中特定字节偏移量的文件指针。您似乎在代码中假设
fseek()
将指针设置为文件中的特定行

假设您的消息不包含任何换行符(在这段代码中找不到这样的事实),您可以使用PHP将整个文件加载到一个数组中,并以这种方式确定所需的行偏移量

例如

$file = file($fileName);
$mssages = array_slice($file, $_SESSION['pos']);
这将为您提供文件中从
$\u会话['pos']
行偏移量开始的所有行的数组


重构现有PHP代码 要重构现有代码,您可以修改以下循环,使其在点击
$\u SESSION['pos']
时停止读取,从而继续从该点加载新消息的逻辑

$count = 0;
while(!feof($File)){
    $tmp = fgets($File);
    $count++;
}
相反,你这样做

$count = 0;
while(!feof($File) || $count < $_SESSION['pos']){
    $tmp = fgets($File);
    $count++;
}
$count=0;
而(!feof($File)| |$count<$\u会话['pos']){
$tmp=fgets($File);
$count++;
}
现在删除
fseek($File,$\u SESSION['pos'])
部分,您的第二个循环应该在您期望的行中拾取


文件格式 如果存储这些消息的文件打算采用行分隔格式,其中文件中的每一行正好代表一条消息(这似乎是您在代码中所做的假设)然后,避免消息内容本身损坏文件的最安全的方法是以不允许消息负载中使用换行符的方式对消息内容进行编码。此类编码的示例包括JSONBase64

后者将使您的存储成本增加33%,但对于行分隔的文件格式,两者都是安全的


Javascript
不清楚为什么javascript逻辑使用
curr
end
来确定是否应该使用
setTimeout()
。如果希望全局循环每10秒不断检查一次新数据,则应该从全局范围调用一次
setInterval(getnewmessages,10000)
,而不是有条件地使用
setTimeout()
。在代码中,如果当前消息是找到的最后一条消息,那么您将不再从js调用PHP来检查新消息,这显然不是您想要的。
setTimeout
setInterval
之间的区别在于
setTimeout
仅在达到计时器时触发一次,而
setInterval
连续地在给定的时间间隔触发回调。

看起来您不需要PHP来读取文件,但是是的,你需要写点东西。@PraveenKumar你到底是什么意思?(我有另一个更新文件的过程)应该从为什么需要从文本文件执行此操作开始,而不是使用某种类型的数据库开始,这在服务器上比滚动文件简单得多own@charlietfl我以前也想过。我发现这是目前最好的解决方案。在下一次更新中,当我的项目完成时,我将开始考虑它。不管怎样,这只是为了练习,它不会伤害我使用
setTimeout
,因为我希望能够停止一些过程并重新启动它们。这取决于用户如何导航到web应用程序。至于您提到的换行符,我将使用文本文件的示例更新我的问题,以查看是否一切正常。
setTimeout
setInterval
计时器都可以停止。它们各自返回一个ID,可以提供给计时器,也可以用来停止计时器。另外,我不想将整个文件读入内存。如果文件的大小超过100MB,那么就会出现问题。这是可以理解的,这就是为什么我的答案为您提供了一个选择,既可以用一种新的、透明的方式轻松解决问题,也可以简单地重构您现有的代码。这两种解决方案都是为了提高效率而不是效率。php的操作代码不起作用。我再次得到所有的数组。但是为什么呢?
$count = 0;
while(!feof($File)){
    $tmp = fgets($File);
    $count++;
}
$count = 0;
while(!feof($File) || $count < $_SESSION['pos']){
    $tmp = fgets($File);
    $count++;
}