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

PHP代码:

  1. <?php
  2. class Test{
  3. //日志路径
  4. const LOG_PATH="E:\phpServer\Apache\logs\error.log";
  5. const NGINX_LOG_PATH="E:\phpServer\\nginx\logs\error.log";
  6. //显示的行数
  7. const PAGES=50;
  8. public static function main(){
  9. header("content-type:text/html;charset=utf-8");
  10.  
  11. if(!empty($_GET['action'])){
  12. self::$_GET['action']();
  13. exit;
  14. }
  15. }
  16.  
  17. public static function showApacheLogs(){
  18. $test=new Test();
  19. $result=$test->readLogs(self::LOG_PATH,self::PAGES);
  20. $html="";
  21. foreach($result as $line){
  22. if(strpos($line,"error:")){
  23. $line="<font color='red'>".$line."</font>";
  24. }
  25. $html.="<div class='line'>".$line."<div>";
  26. }
  27. echo $html;
  28. }
  29. public static function showNginxLogs(){
  30. $test=new Test();
  31. $result=$test->readLogs(self::NGINX_LOG_PATH,self::PAGES);
  32. $html="";
  33. foreach($result as $line){
  34. if(strpos($line,"error")){
  35. $line="<font color='red'>".$line."</font>";
  36. }
  37. $html.="<div class='line'>".$line."<div>";
  38. }
  39. echo $html;
  40. }
  41. /**
  42. * 读取日志
  43. */
  44. private function readLogs($filePath,$num=20){
  45. $fp = fopen($filePath,"r");
  46. $pos = -2;
  47. $eof = "";
  48. $head = false; //当总行数小于Num时,判断是否到第一行了
  49. $lines = array();
  50. while($num>0){
  51. while($eof != "\n"){
  52. if(fseek($fp, $pos, SEEK_END)==0){ //fseek成功返回0,失败返回-1
  53. $eof = fgetc($fp);
  54. $pos--;
  55. }else{ //当到达第一行,行首时,设置$pos失败
  56. fseek($fp,0,SEEK_SET);
  57. $head = true; //到达文件头部,开关打开
  58. break;
  59. }
  60.  
  61. }
  62. array_unshift($lines,fgets($fp));
  63. if($head){ break; } //这一句,只能放上一句后,因为到文件头后,把第一行读取出来再跳出整个循环
  64. $eof = "";
  65. $num--;
  66. }
  67. fclose($fp);
  68. return array_reverse($lines);
  69. }
  70. }
  71. Test::main();
  72. ?>
  73. <style type="text/css">
  74. *{
  75. padding: 0;
  76. margin: 0;
  77. }
  78. .logsBox{
  79. margin:5px;
  80. padding: 5px;
  81. width: 600px;
  82. background: #000;
  83. color:#fff;
  84. font-size: 13px;
  85. float: left;
  86. }
  87. .logsBox .line{
  88. margin: 12px 0;
  89. }
  90. </style>
  91. <div class="logsBox apache">
  92. <div class="line">日志读取...</div>
  93. </div>
  94. <div class="logsBox nginx">
  95. <div class="line">日志读取...</div>
  96. </div>
  97. <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script>
  98. <script type="text/javascript">
  99. $(function(){
  100.  
  101. function showLogs(api,showClass){
  102. function readLogs(){
  103. $.ajax({
  104. url:api,
  105. type:"get",
  106. dataType:"text",
  107. success:function(data){
  108. $(showClass).html(data);
  109. }
  110. });
  111. }
  112. readLogs();
  113. setInterval(readLogs,5000);
  114. }
  115. showLogs("?action=showNginxLogs",".nginx");
  116. showLogs("?action=showApacheLogs",".apache");
  117. });
  118. </script>

[PHP] 读取大文件并显示的更多相关文章

  1. PHP如何快速读取大文件

    在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file.file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们所需要的功能.但当所操作的文件是一个比较大的 ...

  2. PHP读取大文件的几种方法介绍

    读取大文件一直是一个头痛的问题,我们像使用php开发读取小文件可以直接使用各种函数实现,但一到大文章就会发现常用的方法是无法正常使用或时间太长太卡了,下面我们就一起来看看关于php读取大文件问题解决办 ...

  3. php -- 读取大文件

    在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file.file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们所需要的功能.但当所操作的文件是一个比较大的 ...

  4. 【转】PHP如何快速读取大文件

    在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file.file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们所需要的功能.但当所操作的文件是一个比较大的 ...

  5. php中读取大文件实现方法详解

    php中读取大文件实现方法详解 来源:   时间:2013-09-05 19:27:01   阅读数:6186 分享到:0 [导读] 本文章来给各位同学介绍php中读取大文件实现方法详解吧,有需要了解 ...

  6. PHP几个快速读取大文件例子

    PHP几个快速读取大文件例子 感谢 把我给崩了 的投递 时间:2014-10-16 来源:三联 在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file.file_get_contents ...

  7. java读取大文件

    1  多线程 2  java内存映射读取大文件

  8. php使用file函数、fseek函数读取大文件效率分析

    php读取大文件可以使用file函数和fseek函数,但是二者之间效率可能存在差异,本文章向大家介绍php file函数与fseek函数实现大文件读取效率对比分析,需要的朋友可以参考一下. 1. 直接 ...

  9. Java多线程读取大文件

    前言 今天是五一假期第一天,按理应该是快乐玩耍的日子,但是作为一个北漂到京师的开发人员,实在难想出去那玩耍.好玩的地方比较远,近处又感觉没意思.于是乎,闲着写篇文章,总结下昨天写的程序吧. 昨天下午朋 ...

随机推荐

  1. 实现仿知乎的开场动画,图片zoomin的效果,实现原理,没加动效

    知乎等应用的开场动画是:全屏显示一副图像,并以图像的中间为原点,实现放大(也就是zoomin)的动画,让等待的过程不再单调乏味. 最近不是很忙,因此想了下如何实现这种效果,方案是:采用调整imagev ...

  2. hexdump—Linux系统的二进制文件查看工具

    hexdump 无参: 相当于 hexdump -x 0000000 457f 464c 0102 0001 0000 0000 0000 0000 0000010 0002 003e 0001 00 ...

  3. windows server 2003 ODBC数据源配置错误

    1.ODBC 数据源链接失败,错误 :STATE hy000, 不能产生SSPI上下文, 2.文件服务器,TCP/IP协议属性中,DNS没有填写,填入DNS即可解决.

  4. 解决URL路径包含+等特殊符号,编码也无效的办法

    <?xml version="1.0" encoding="UTF-8"?><configuration>      <syste ...

  5. 使用DOSBox在Win7_x64下搭建汇编环境

    1. 软件安装 1. debug.exe,masm.exe,link.exe,edit.com等汇编工具,一般32位的windows系统有自带,但64位系统下并没有,而且将32位系统下的工具拷贝到64 ...

  6. ASP.NET MVC 获取当前访问域名

    var request = filterContext.HttpContext.Request; string url = request.Url.Authority; string function ...

  7. iframe高度宽度自适应(转)

    http://www.cnblogs.com/snandy/p/3900016.html 跨子域的iframe高度自适应 完全跨域的iframe高度自适应 同域的我们可以轻松的做到 1. 父页面通过i ...

  8. 自动化测试管理平台ATMS(V2.0.1_8.12)下载

    自动化测试管理平台ATMS(V2.0.1_8.12)下载: http://automationqa.com/forum.php?mod=viewthread&tid=2701&from ...

  9. 碰到一个在app内部浏览器锚点异常的问题

    最近在做一个文章评论的功能,其中一个需求是:在提交完评论后,需要跳转到位于页面底部的评论区域,正常情况下location.href=http://m.hostname.cn/article#comme ...

  10. Android Material Design控件学习(一)——TabLayout的用法

    前言 Google官方在14年Google I/O上推出了全新的设计语言--Material Design.一并推出了一系列实现Material Design效果的控件库--Android Desig ...