PHP/Javascript - 只从巨大的日志文件中实时读取添加的行
PHP/Javascript - read only added lines in real time from huge log file
我已经搜索了好几天这样的东西,但我找不到任何东西。我对Javascript的了解非常有限,所以我在这里请求你们帮助我。
基本上我需要一个 PHP 脚本,它实时读取一个巨大的日志 .txt 文件(没有页面刷新),该文件不断更新。但它应该只读取自从我打开 .php 页面以来写入文件的最新行。这意味着如果我刷新我的页面,它必须从头开始加载新行。
我现在知道了 (catchlogs.php):
$f = fopen("test.txt", 'r');
$maxLineLength = 1000;
$linesToRead = 1;
fseek($f, -$maxLineLength*$linesToRead, SEEK_END);
$res = array();
while (($buffer = fgets($f, $maxLineLength)) !== false) {
$res[] = $buffer;
}
$content = array_slice($res, -$linesToRead);
for($i = 0; $i < $linesToRead; $i++) {
echo $content[$i]."<br>";
}
还有这个(logreader.php):
<script type="text/javascript">
var auto_refresh = setInterval(
(function () {
$("#logreader").load("catchlogs.php");
}), 1000);
</script>
<div id="logreader"></div>
这会加载最新的 10 行,但每秒对它们进行切片。我不需要有限的行数,我需要一个脚本,它从最后一行开始加载行,直到我刷新页面(或关闭它或其他)。
谢谢!
这是您的脚本,由我测试。
catchlogs.php
define("LOG_FILE", "test.txt");
/* function to count lines from a file */
function count_line_numbers($file){
$linecount = 0;
$handle = fopen($file, "r");
while(!feof($handle)){
$line = fgets($handle);
$linecount++;
}
fclose($handle);
// return results
return $linecount;
}
/* show all lines from line */
function logs_started_by_line($file, $xline = 0){
$currline = 0;
$handle = fopen($file, "r");
while(!feof($handle)){
$line = fgets($handle, 2000);
if($xline <= $currline)
echo $line."<br>";
$currline++;
}
fclose($handle);
}
session_start();
if(isset($_GET['do'])){ $_SESSION['start'] = -1; }
if( ! isset($_SESSION['start']) || $_SESSION['start'] == -1 ){
$_SESSION['start'] = count_line_numbers(LOG_FILE);
}
logs_started_by_line( LOG_FILE, $_SESSION['start'] );
logreader.php
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
$("#logreader").load("catchlogs.php?do=refresh");
var auto_refresh = setInterval(
(function () {
$("#logreader").load("catchlogs.php");
}), 1000);
});
</script>
<div id="logreader"></div>
test.txt
line 1
new log
something..
最完美的解决方案-使用Node-Webkit并监听tail -f /path/to/log
。
我已经搜索了好几天这样的东西,但我找不到任何东西。我对Javascript的了解非常有限,所以我在这里请求你们帮助我。
基本上我需要一个 PHP 脚本,它实时读取一个巨大的日志 .txt 文件(没有页面刷新),该文件不断更新。但它应该只读取自从我打开 .php 页面以来写入文件的最新行。这意味着如果我刷新我的页面,它必须从头开始加载新行。
我现在知道了 (catchlogs.php):
$f = fopen("test.txt", 'r');
$maxLineLength = 1000;
$linesToRead = 1;
fseek($f, -$maxLineLength*$linesToRead, SEEK_END);
$res = array();
while (($buffer = fgets($f, $maxLineLength)) !== false) {
$res[] = $buffer;
}
$content = array_slice($res, -$linesToRead);
for($i = 0; $i < $linesToRead; $i++) {
echo $content[$i]."<br>";
}
还有这个(logreader.php):
<script type="text/javascript">
var auto_refresh = setInterval(
(function () {
$("#logreader").load("catchlogs.php");
}), 1000);
</script>
<div id="logreader"></div>
这会加载最新的 10 行,但每秒对它们进行切片。我不需要有限的行数,我需要一个脚本,它从最后一行开始加载行,直到我刷新页面(或关闭它或其他)。
谢谢!
这是您的脚本,由我测试。
catchlogs.php
define("LOG_FILE", "test.txt");
/* function to count lines from a file */
function count_line_numbers($file){
$linecount = 0;
$handle = fopen($file, "r");
while(!feof($handle)){
$line = fgets($handle);
$linecount++;
}
fclose($handle);
// return results
return $linecount;
}
/* show all lines from line */
function logs_started_by_line($file, $xline = 0){
$currline = 0;
$handle = fopen($file, "r");
while(!feof($handle)){
$line = fgets($handle, 2000);
if($xline <= $currline)
echo $line."<br>";
$currline++;
}
fclose($handle);
}
session_start();
if(isset($_GET['do'])){ $_SESSION['start'] = -1; }
if( ! isset($_SESSION['start']) || $_SESSION['start'] == -1 ){
$_SESSION['start'] = count_line_numbers(LOG_FILE);
}
logs_started_by_line( LOG_FILE, $_SESSION['start'] );
logreader.php
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
$("#logreader").load("catchlogs.php?do=refresh");
var auto_refresh = setInterval(
(function () {
$("#logreader").load("catchlogs.php");
}), 1000);
});
</script>
<div id="logreader"></div>
test.txt
line 1
new log
something..
最完美的解决方案-使用Node-Webkit并监听tail -f /path/to/log
。