有时候我们需要实时的输出一些日志文件,LINUX下有一个tail命令非常 好用,但我们服务器不是linux或者没有权限时,可以使用以下脚本来实现:
<?php /** * php模拟tail -f file.log 实时输出日志 * 请先指定日志目录,调用方式:oblog.php?f=file.log * 本代码在nginx服务器下可能不能正常工作 * * @author Steven.liao<lxq73061@163.com> * @modify_date 2017-05-11 16:04 * @link http://www.onebound.cn * */ 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); ?>
效果可以自己打印