2017-05-29 137 views
0

我正在开发一个PHP日志文件查看器,该文件读取器应该读取文件中的10行(例如2 GB),并且当用户单击下一行时,必须读取随后的10行。当按下后退按钮时,最后10行必须被打印。在php中读取大文件并逐行导航

到目前为止,我已经使用fgets(由于文件的大小)实现了文件读取,并且试图找出如何寻找下10行和前10行。

if($handle) 
{ 
    $cnt=1; 
    while(($buffer=fgets($handle))!==false and $cnt<=10) { 
     echo $buffer; 
     $cnt++; 
    } 
    if(feof($handle)) { 
     echo "error"; 
    } 

} 
+0

我将与外壳执行'EXEC做到这一点()'和使用'tail'函数来解析的最后10行。 –

+0

你在前端使用什么?网页浏览器? – Juned

+0

yes.web browser- jquery在php后端启动动作 – Jeyaganesh

回答

0

在PHP中的SplFileObject类做你想做的事情。参见: http://php.net/manual/en/splfileobject.seek.php

示例代码:

<?php 
// Set $lineNumber to the line that you want to start at 
// Remember that the first line in the file is line 0 
$lineNumber = 43; 
// This sets how many lines you want to grab 
$lineCount = 10; 

// Open the file 
$file = new SplFileObject("logfile.log"); 

// This seeks to the line that you want to start at 
$file->seek($lineNumber); 

for($currentLine=0; $currentLine < $lineCount; $currentLine++) { 
    echo $file->current(); 
    $file->next(); 
} 
?> 
+0

对大文件> 2gb做这项工作吗?另外,当用户点击下一个按钮..我需要再次创建$文件对象? – Jeyaganesh

+0

应该在大文件上正常工作。既然你是从网上调用这个,你可能每次都必须打开$ file,除非你想建立某种服务器进程来保持日志文件始终打开,并提供10行客户端应用程序正在请求(可能通过AJAX调用)。也就是说,你可能只是简单的实现你的目的(即使用SplFileObject打开文件,抓住你需要的10行,然后回显给用户)。 –

+0

顺便说一句,我采取的另一种方法(当我正在处理服务器设备项目时)是建立一个将日志文件提交到数据库(在这种情况下为MySQL)的后端进程,然后我们可以快速查询以获取日期范围,特定类型的消息,特定数量和日志行范围等。 –