[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/industrynews/12599.html

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

相关推荐

发表回复

登录后才能评论