-1

我现在正在tail -f用 PHP 编写一个 Web 实用程序。我已经完成了tail.php每 x 毫秒 ajax-requests 以获取最后添加的行的部分。
现在,我需要以某种方式跟踪最后打印的行是什么。我考虑过使用ftell它并将其保存在 cookie 中,但由于文件开头的行也可能被剪切,所以这并不总是有效。

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

有什么不明白的请追问,不是那么容易描述的 ;-)

4

2 回答 2

1

我没有尝试过,但是也许您可以使用诸如 Prototype 之类的 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;
        }
    }
});
于 2012-10-06T14:10:55.627 回答
0

如果您希望纯粹在 PHP 中执行此操作,即使我想知道如何 - 如果您已经必须在客户端拥有 AJAX 处理功能 - 您可以简单地使用会话变量。

在 PHP 中

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

像这样的东西应该可以完成这项工作。如果您遇到 PHP 无法识别来自 AJAX 请求的会话的问题(尽管这些时间已经过去了,并且这个问题不应该发生) - 尝试在每次将 PHPSESSID 发送到服务器时将其与您的 ajax 请求一起发送。

于 2012-10-06T15:04:15.503 回答