【问题标题】:php web tail -f utility [closed]php web tail -f 实用程序[关闭]
【发布时间】:2012-10-06 13:45:12
【问题描述】:

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

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

如果有不明白的地方请追问,不是那么容易描述的;-)

【问题讨论】:

  • 这只是一个 jquery ajax 请求 GET'ing tail.php?file=FILE&getlog。无需发布。
  • 这里有一些想法:serverfault.com/questions/355311/…
  • @Zulakis:您应该粘贴迄今为止尝试过的 PHP 代码,以便您的问题更清楚。此外,您应该使您的问题更加具体。您在实施中遇到的确切问题是什么?另外,您在该 php 脚本中根本不使用 tail 的可能性有多大?
  • 您在这台服务器上有多少访问权限?我们是否在这里寻找纯 PHP 解决方案?是否需要 Windows 支持?
  • deizel:是的,正在寻找纯 PHP 解决方案。 hakre:不,我将只使用 PHP 文件函数。问题是我不知道如何跟踪最后一个显示行(最后一个请求)在哪一点。

标签: php ajax tail


【解决方案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;
        }
    }
});

【讨论】:

  • 我只想提交新行,检查应该在服务器端完成。这是必要的,因为它每秒至少会被拉一次,并且会导致过多的流量。
  • @Zulakis:如果您发布带有问题的代码(因为您编写了微不足道的代码),您就不会为 Cummander Checkov 带来这么多无用的工作。这是一个很好的例子,为什么实际上发布自己的代码是件好事,即使您认为这太容易了。
  • 没什么大不了的。与提供编码情况的粗略描述相比,调整代码以使其可以脱离上下文呈现可能需要付出太多努力。
【解决方案2】:

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

在 PHP 中

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

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

【讨论】:

  • 另一种方法是保持与服务器的持续连接,在此期间,您每次注意到总行数(或内容长度)发生变化/增加时都会响应客户端。
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 2017-07-16
  • 1970-01-01
相关资源
最近更新 更多