Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.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
PHPWebtail-f实用程序_Php_Ajax_Tail - Fatal编程技术网

PHPWebtail-f实用程序

PHPWebtail-f实用程序,php,ajax,tail,Php,Ajax,Tail,目前我正在用PHP编写一个webtail-f实用程序。 我已经完成了ajax每x毫秒请求tail.php以获取最后添加的行的部分。 现在我正处在这样一个时刻,不知何故,我需要跟踪最后一行是什么。我曾考虑过使用ftell并将其保存在cookie中,但由于文件开头的行也可能被剪切,所以这并不总是可行的 有什么办法吗?我希望在不使用额外数据库的情况下执行此操作,但通过使用cookie/会话和“指针”数据的大小必须很小 如果你不明白一些事情,请询问,这不是那么容易描述的;-) 我没有尝试过这个,但也许您

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

有什么办法吗?我希望在不使用额外数据库的情况下执行此操作,但通过使用cookie/会话和
“指针”
数据的大小必须很小


如果你不明白一些事情,请询问,这不是那么容易描述的;-)

我没有尝试过这个,但也许您可以使用JS库(如Prototype)来确定输出的长度,然后将其与上一个响应的长度进行比较,然后通过在适当的位置剪切字符串来采取相应的行动

未经测试的示例:

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;
        }
    }
});

如果您希望纯粹在PHP中实现这一点,尽管我想知道,如果您已经在客户端拥有AJAX处理功能,您可以简单地使用session变量

在PHP中

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

像这样的东西应该能完成任务。如果PHP无法识别来自AJAX请求的会话(虽然这些时间已经过去了,这个问题不应该发生),请尝试在每次将PHPSESSID发送到服务器时将其与AJAX请求一起发送。

这只是一个jquery AJAX请求
GET
'ing
tail.PHP?file=file&getlog
。这里有一些想法:@Zulakis:你应该粘贴你已经尝试过的PHP代码,这样你的问题就更清楚了。你也应该让你的问题更具体。您的实现遇到的确切问题是什么?还有,您在该php脚本中根本不使用
tail
的可能性有多大?您在该服务器上有多少访问权限?我们在这里寻找纯PHP解决方案吗?需要Windows支持吗?戴泽尔:需要纯PHP解决方案。哈克雷:不,我将只使用PHP文件函数。问题是,我不知道如何跟踪最后一个显示行(带有最后一个请求)的位置。我只想提交新行,检查应该在服务器端完成。这是必要的,因为它至少每秒被拉一次,并且会造成太多的流量。@Zulakis:如果你在问题中发布你的(正如你写的那样)代码,你就不会给Cummander Checkov带来太多无用的工作了。这是一个很好的例子,说明了为什么发布自己的代码很好,尽管你认为这太简单了。没什么大不了的。与提供编码情况的粗略描述相比,调整代码以使其能够脱离上下文显示可能需要花费太多的精力。另一种方法是保持与服务器的持续连接,在此期间,每当您注意到总行数(或内容长度)增加时,您都会回复客户端已经改变/增加了。