[PHP] 读取大文件并显示详解编程语言

使用PHP读取日志文件,当文件比较大的时候,会报内存不足,因此应该部分读取,读取指定的行数的数据

[PHP] 读取大文件并显示详解编程语言

PHP代码:

<?php 
class Test{ 
//日志路径 
const LOG_PATH="E:/phpServer/Apache/logs/error.log"; 
const NGINX_LOG_PATH="E:/phpServer//nginx/logs/error.log"; 
//显示的行数 
const PAGES=50; 
public static function main(){ 
header("content-type:text/html;charset=utf-8"); 
if(!empty($_GET['action'])){ 
self::$_GET['action'](); 
exit; 
} 
} 
public static function showApacheLogs(){ 
$test=new Test(); 
$result=$test->readLogs(self::LOG_PATH,self::PAGES); 
$html=""; 
foreach($result as $line){ 
if(strpos($line,"error:")){ 
$line="<font color='red'>".$line."</font>"; 
} 
$html.="<div class='line'>".$line."<div>"; 
} 
echo $html; 
} 
public static function showNginxLogs(){ 
$test=new Test(); 
$result=$test->readLogs(self::NGINX_LOG_PATH,self::PAGES); 
$html=""; 
foreach($result as $line){ 
if(strpos($line,"error")){ 
$line="<font color='red'>".$line."</font>"; 
} 
$html.="<div class='line'>".$line."<div>"; 
} 
echo $html; 
} 
/** 
* 读取日志 
*/ 
private function readLogs($filePath,$num=20){ 
$fp = fopen($filePath,"r"); 
$pos = -2;   
$eof = "";   
$head = false;   //当总行数小于Num时,判断是否到第一行了   
$lines = array();   
while($num>0){   
while($eof != "/n"){   
if(fseek($fp, $pos, SEEK_END)==0){    //fseek成功返回0,失败返回-1   
$eof = fgetc($fp);   
$pos--;   
}else{                               //当到达第一行,行首时,设置$pos失败   
fseek($fp,0,SEEK_SET);   
$head = true;                   //到达文件头部,开关打开   
break;   
}   
}   
array_unshift($lines,fgets($fp));   
if($head){ break; }                 //这一句,只能放上一句后,因为到文件头后,把第一行读取出来再跳出整个循环   
$eof = "";   
$num--;   
}   
fclose($fp);   
return array_reverse($lines);   
} 
} 
Test::main(); 
?> 
<style type="text/css"> 
*{ 
padding: 0; 
margin: 0; 
} 
.logsBox{ 
margin:5px; 
padding: 5px; 
width: 600px; 
background: #000; 
color:#fff; 
font-size: 13px; 
float: left; 
} 
.logsBox .line{ 
margin: 12px 0; 
} 
</style> 
<div class="logsBox apache"> 
<div class="line">日志读取...</div> 
</div> 
<div class="logsBox nginx"> 
<div class="line">日志读取...</div> 
</div> 
<script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script> 
<script type="text/javascript"> 
$(function(){ 
function showLogs(api,showClass){ 
function readLogs(){ 
$.ajax({ 
url:api, 
type:"get", 
dataType:"text", 
success:function(data){ 
$(showClass).html(data); 
} 
}); 
} 
readLogs(); 
setInterval(readLogs,5000); 
} 
showLogs("?action=showNginxLogs",".nginx"); 
showLogs("?action=showApacheLogs",".apache"); 
}); 
</script>

 

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/12599.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论