• [PHP] 读取大文件并显示


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

    PHP代码:

    <?php
    class Test{
        //日志路径
        const LOG_PATH="E:phpServerApachelogserror.log";
        const NGINX_LOG_PATH="E:phpServer\nginxlogserror.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 != "
    "){  
                    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>
  • 相关阅读:
    ABBYY Cup 3.0G3. Good Substrings
    Codeforces Beta Round #94 (Div. 1 Only)B. String sam
    hdu5421Victor and String 两端加点的pam
    loj#2059. 「TJOI / HEOI2016」字符串 sam+线段树合并+倍增
    Codeforces Round #349 (Div. 1)E. Forensic Examination
    ACM-ICPC World Finals 2019 G.First of Her Name
    51nod1647 小Z的trie
    LOJ #10222. 「一本通 6.5 例 4」佳佳的 Fibonacci 题解
    POJ 2443 Set Operation 题解
    CSP-J 2019游记
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5722743.html
Copyright © 2020-2023  润新知