php web tail -f实用程序

时间:2012-10-06 13:45:12

标签: php ajax tail

我正在用PHP编写一个Web tail -f实用程序。 我已经完成了每隔x毫秒ajax请求tail.php的部分以获得最后添加的行 现在,我正处于需要跟踪最后一条打印线的位置。我考虑过使用ftell并将其保存在cookie中,但由于也可能会在文件的开头部分删除行,因此并不总是有用。

关于如何做到这一点的任何想法?我想在没有额外数据库的情况下这样做,但是使用cookie / session并且"pointer"数据的大小必须很小。

请问你是否理解某些事情,这并不容易描述; - )

2 个答案:

答案 0 :(得分:1)

我没有尝试过这个,但也许您可以使用原型等JS库来确定输出的长度,然后将其与最后一个响应的长度进行比较,然后通过切割正确的字符串来进行相应的操作。位置。

未经测试的例子:

var lastLength;
Ajax.Request('/tail.php', {
    onSuccess: function(data){
        /* this is our callback and data.responseText will contain the raw response from the server */
        var curLength=String(data.responseText).length;
        if(curLength>lastLength) {
            $('myDiv').insert(data.responseText.substr(lastLength)); // append the new part of the string to a DIV with id 'myDiv'  
            lastLength=curLength;
        }
    }
});

如果由于某种原因该解决方案不能令人满意或导致问题,您可以尝试让tail.php发送的不仅仅是原始数据。相反,JSON可用于包括字节数和数据。

假设

$tailOutput

包含最新输出,使用

echo json_encode(array(
    'tailOutput' => substr($tailOutput, $_REQUEST['tailLength']),
    'curLength'     => strlen($tailOutput)
));

将数据发送回客户端,现在包括最后的长度信息,然后相应地调整JS代码。

var lastLength;
Ajax.Request('/tail.php', {
    parameters: {
        tailLength: lastLength
    },
    onSuccess: function(data){
            var obj=data.responseText.evalJSON(); //convert to json object
            $('myDiv').insert(obj.tailOutput);
            lastLength=obj.curLength;
        }
    }
});

答案 1 :(得分:0)

如果你想纯粹用PHP做这件事,即使我想知道如何 - 如果你必须在客户端也必须有AJAX处理功能 - 你可以简单地使用会话变量。

在PHP中

$outputToClient=substr($tailOutput, ($_SESSION['lastTailLength']?$_SESSION['lastTailLength']:0));
$_SESSION['lastTailLength']=strlen($tailOutput);
echo $outputToClient;

这样的事情应该可以胜任。如果您遇到PHP无法识别来自AJAX请求的会话的问题(尽管这些时间已经过去并且不应该出现此问题) - 尝试每次将PHPSESSID与ajax请求一起发送到服务器时发送它。