我正在用PHP编写一个Web tail -f
实用程序。
我已经完成了每隔x毫秒ajax请求tail.php
的部分以获得最后添加的行
现在,我正处于需要跟踪最后一条打印线的位置。我考虑过使用ftell
并将其保存在cookie中,但由于也可能会在文件的开头部分删除行,因此并不总是有用。
关于如何做到这一点的任何想法?我想在没有额外数据库的情况下这样做,但是使用cookie / session并且"pointer"
数据的大小必须很小。
请问你是否理解某些事情,这并不容易描述; - )
答案 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请求一起发送到服务器时发送它。