php模拟tail -f 实时输出日志
有时候我们需要实时的输出一些日志文件,LINUX下有一个tail命令非常 好用,但我们服务器不是linux或者没有权限时,可以使用以下脚本来实现:
<?php
/**
* php模拟tail -f file.log 实时输出日志
* 请先指定日志目录,调用方式:oblog.php?f=file.log
* 本代码在nginx服务器下可能不能正常工作
*
* @author
* @modify_date 2017-05-11 16:04
* @link http://www.
*
*/
if(1 != count($_GET)){
echo "调用格式错误!使用格式 oblog.php?f=file.log".PHP_EOL;
exit();
}
$dir = dirname(__FILE__).'/runtime/logs/';//定义日志保存的目录
$file_name = $_GET['f'];//日志文件名
if(strpos($file_name,'..')!==false){//禁止访问上级目录
echo 'Error!';
exit();
}
$file_name = $dir . $file_name;
define("MAX_SHOW", 8192);//每次最多输出多少字节
$file_size = 0;
$file_size_new = 0;
$add_size = 0;
$ignore_size = 0;
echo str_pad('',4096);
echo str_repeat(' ', 1024*256);
echo '<script>function gb(){ var h = document.documentElement.scrollHeight || document.body.scrollHeight; window.scrollTo(h+200,h+200);};setInterval("gb();",1000)</script>';
$fp = fopen($file_name, "r");
while($fp && 1){
clearstatcache();
$file_size_new = filesize($file_name);
$add_size = $file_size_new - $file_size;
if($add_size > 0){
if($add_size > MAX_SHOW){
$ignore_size = $add_size - MAX_SHOW;
$add_size = MAX_SHOW;
fseek($fp, $file_size + $ignore_size);
}
$new = fread($fp, $add_size);
if($new){
echo nl2br($new); ob_flush();flush();
}
$file_size = $file_size_new;
}
usleep(50000);
}
fclose($fp);
?>
效果可以自己打印