PHP Logtail解决方案

PHP Logtail解决方案,php,Php,我会利用unix logtail周期性地获取一些日志文件的结尾,但我意识到在php中实现这一点并不难 我在网上找到的php logtail示例相当于php tail实现 unix logtail所做的是,每次从日志文件读取时,它都会将偏移量保存在某个位置,然后下次运行时,只会从该日志中获取新行 这正是我需要的,如果没有新数据,我不想返回任何行 任何一个熟练的php程序员都可以为我修改它来做同样的事情吗 <?php class LogRead { private $filename

我会利用unix logtail周期性地获取一些日志文件的结尾,但我意识到在php中实现这一点并不难

我在网上找到的php logtail示例相当于php tail实现

unix logtail所做的是,每次从日志文件读取时,它都会将偏移量保存在某个位置,然后下次运行时,只会从该日志中获取新行

这正是我需要的,如果没有新数据,我不想返回任何行

任何一个熟练的php程序员都可以为我修改它来做同样的事情吗

<?php

class LogRead
{
    private $filename = '';

    function __construct($filename) 
    {
        $this->filename = $filename;
    }

    public function tail($lines = 10) 
    {
        $data = '';
        $fp = fopen($this->filename, "r");
        $block = 4096;
        $max = filesize($this->filename);

        for($len = 0; $len < $max; $len += $block) 
        {
            $seekSize = ($max - $len > $block) ? $block : $max - $len;
            fseek($fp, ($len + $seekSize) * -1, SEEK_END);
            $data = fread($fp, $seekSize) . $data;

            if(substr_count($data, "\n") >= $lines + 1) 
            {
                /* Make sure that the last line ends with a '\n' */
                if(substr($data, strlen($data)-1, 1) !== "\n") {
                    $data .= "\n";
                }

                preg_match("!(.*?\n){". $lines ."}$!", $data, $match);
                fclose($fp);
                return $match[0];
            }
        }
        fclose($fp);
        return $data; 
    }
}
?>

谢谢

这些日志文件会有多大?如果文件不能得到hugeHello,那么读入内存的解决方案将很简单。日志大小不超过50meg,我可以将它们旋转出来,但使用偏移量的全部意义在于,您不会从一开始就开始读取,至少第二次是这样: