我想用PHP编写/读取滚动日志文件,其中只存储/读取最新的~300行,并丢弃任何旧行。我不确定最有效的方法 - 它需要快速工作,因为它在高流量网站上录制页面点击。
另一个PHP脚本将定期读取日志文件并使用数据进行计算。有很多PHP文件函数我很困惑从哪里开始!
我认为我的托管环境无法访问tail
或awk
等命令,因此首选纯PHP解决方案。任何帮助表示赞赏!
答案 0 :(得分:0)
你可以使用fopen: http://us3.php.net/manual/en/function.fopen.php
$mode = 'a+'; // opens the file with read/write access and sets the pointer to the end of the file
$handle = fopen ($filename, $mode);
接下来,你将文件泵入一个数组,然后抛开除最后300行之外的所有内容。
如果你真的对将文件保持在一定的大小感兴趣(你说〜300行),那么你可以使用fseek http://us3.php.net/manual/en/function.fseek.php(来自手册):
<?php
$fp = fopen('somefile.txt', 'r');
// read some data
$data = fgets($fp, 4096);
// move back to the beginning of the file
// same as rewind($fp);
fseek($fp, 0);
?>
答案 1 :(得分:0)
对于性能比较,您必须进行一些基准测试,但这是一种可行的方法:
<?php
function writeToLog($file, $str, $maxLines = 300) {
$linesToWrite = explode("\n", $str);
$numLinesToWrite = count($linesToWrite);
$logLines = explode("\n", file_get_contents($file));
array_splice($logLines,
$maxLines - $numLinesToWrite,
$numLinesToWrite,
$linesToWrite);
file_put_contents($file, implode("\n", $logLines));
}
答案 2 :(得分:0)
不确定这个的表现,但这是我的看法:
// read lines in file as array
$lines = file( 'log.log', FILE_IGNORE_NEW_LINES );
// log file equal to or larger than 300 lines?
if( count( $lines ) >= 300 )
{
// remove everything from line 0 to 299 from the end
// in other words keep last 299 lines
array_splice( $lines, 0, -299 );
}
// append a new line of data
$lines[] = 'Test data ' . time() . "\n";
// put the lines back, first imploding the lines array with a newline char
file_put_contents( 'log.log', implode( "\n", $lines ) );
答案 3 :(得分:0)
这样做的PHP函数。确保日志可写。如果不存在则创建日志:
// keeps log_file <= max_log_lines lines
function logTruncated($report, $log_file, $max_log_lines = 1000)
{
if (!$report || !$log_file)
return;
if (!touch($log_file))
die('Cant write log: '.$log_file);
$lines = array_merge(file($log_file), preg_split('/\r?\n/', $report));
$lines = array_slice($lines, -1 * $max_log_lines);
file_put_contents($log_file, implode("\n", $lines));
}
答案 4 :(得分:0)
只检查日志文件是否已经存在,如果它大于最大大小(在我的代码中为 4Mb),它将读取它,在开头删除一些文本并添加新文本以保持大小在最大范围内尺寸
$text = "Your text to log";
//if file exists and it's bigger than 4Mb then remove some text at the beginning to limit size
$log_file = __DIR__ . DIRECTORY_SEPARATOR . 'LOGS' . 'log.txt';
if(file_exists($log_file)){
clearstatcache();
$size = filesize($log_file);
if($size >= 4194304){
$chunk = file_get_contents($log_file, FALSE, NULL, -(4194304 - strlen($text)));
$text = $chunk . $text;
$mode = 0; //overwrite
} else $mode = FILE_APPEND;
}
$file_exc = file_put_contents($log_file, $text . PHP_EOL , $mode | LOCK_EX);