专栏首页陶士涵的菜地[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>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [PHP] 使用反射实现的控制反转

    1.$this->getObject($class, $config->getConfig('param'), array($this), $interfac...

    陶士涵
  • [PHP] 项目实践中的自动加载实现

    1.使用spl_autoload_register函数注册一个自己定义的自动加载函数 2.当在代码中new一个不存在的类的时候,上面的函数会被调用,不存在的类名...

    陶士涵
  • [MySQL] 解决Error 1698: Access denied for user 'root'@'localhost'

    当程序中使用root账号连接mysql时报以下错误,但是使用命令行是可以正常连接的,那么就查询下mysql数据库的user表,查看下当前用户的密码加密方式,看看...

    陶士涵
  • Bootstrap快速入门

    Bootstrap学习有两个重点,一个是概念的理解,理解bootstrap是如何通过div来代替过去的table布局的;一个是常用结构的熟悉,做到需要的组件及时...

    用户1216676
  • Vue学习笔记之Vue组件

    vue的核心基础就是组件的使用,玩好了组件才能将前面学的基础更好的运用起来。组件的使用更使我们的项目解耦合。更加符合vue的设计思想MVVM。

    Jetpropelledsnake21
  • iOS开发-分类与类扩展

    雷潮
  • cordova插件-Device Motion

    添加插件 $ cordova plugin addcordova-plugin-device-motion ? 图 12如上则插入成功 插件的使用 Me...

    roc
  • OpenCV 直线拟合及应用

    [图片] OpenCV提供了7种(-1为用户定义)直线拟合方法,如下: CV_DIST_USER =-1, /* User defined dista...

    chaibubble
  • FeignClient源码深度解析

    大体步骤: 一、注册FeignClient配置类和FeignClient BeanDefinition 二、实例化Feign上下文对象FeignContext ...

    方志朋
  • gluster性能相关中继器默认值说明

    在./vols/tank/tank-fuse.vol(客户端)文件中,默认会配置如下中继器:

    党志强

扫码关注云+社区

领取腾讯云代金券