Hướng dẫn how do i read the last line of a text file in php? - làm cách nào để đọc dòng cuối cùng của tệp văn bản trong php?

Tôi đã gặp phải một vấn đề. Tôi có một nhật ký trên một hộp Linux trong đó được viết đầu ra từ một số quy trình đang chạy. Tệp này đôi khi có thể trở nên thực sự lớn và tôi cần đọc dòng cuối cùng từ tệp đó.

Vấn đề là hành động này sẽ được gọi thông qua yêu cầu AJAX khá thường xuyên và khi kích thước tệp của nhật ký đó có được hơn 5-6MB thì không tốt cho máy chủ. Vì vậy, tôi nghĩ rằng tôi phải đọc dòng cuối cùng nhưng không đọc toàn bộ tệp và chuyển qua nó hoặc tải nó trong RAM vì điều đó sẽ chỉ tải đến cái chết của tôi.

Có bất kỳ tối ưu hóa cho hoạt động này để nó chạy trơn tru và không gây hại cho máy chủ hoặc tiêu diệt Apache?

Tùy chọn khác mà tôi có là


$fp = fopen(".....");
fseek($fp, -1, SEEK_END); 
$pos = ftell($fp);
$LastLine = "";
// Loop backword util "\n" is found.
while((($C = fgetc($fp)) != "\n") && ($pos > 0)) {
    $LastLine = $C.$LastLine;
    fseek($fp, $pos--);
}
fclose($fp);
2 nhưng nó không tốt lắm.

Chỉnh sửa sau: Tôi không muốn đặt tệp vào RAM vì nó có thể trở nên lớn.


$fp = fopen(".....");
fseek($fp, -1, SEEK_END); 
$pos = ftell($fp);
$LastLine = "";
// Loop backword util "\n" is found.
while((($C = fgetc($fp)) != "\n") && ($pos > 0)) {
    $LastLine = $C.$LastLine;
    fseek($fp, $pos--);
}
fclose($fp);
3 không phải là một lựa chọn.I DO NOT want to put the file in RAM because it might get huge.

$fp = fopen(".....");
fseek($fp, -1, SEEK_END); 
$pos = ftell($fp);
$LastLine = "";
// Loop backword util "\n" is found.
while((($C = fgetc($fp)) != "\n") && ($pos > 0)) {
    $LastLine = $C.$LastLine;
    fseek($fp, $pos--);
}
fclose($fp);
3 is not an option.

Hướng dẫn how do i read the last line of a text file in php? - làm cách nào để đọc dòng cuối cùng của tệp văn bản trong php?

Đã hỏi ngày 2 tháng 10 năm 2009 lúc 15:09Oct 2, 2009 at 15:09

1

Điều này sẽ hoạt động:

$line = '';

$f = fopen('data.txt', 'r');
$cursor = -1;

fseek($f, $cursor, SEEK_END);
$char = fgetc($f);

/**
 * Trim trailing newline chars of the file
 */
while ($char === "\n" || $char === "\r") {
    fseek($f, $cursor--, SEEK_END);
    $char = fgetc($f);
}

/**
 * Read until the start of file or first newline char
 */
while ($char !== false && $char !== "\n" && $char !== "\r") {
    /**
     * Prepend the new char
     */
    $line = $char . $line;
    fseek($f, $cursor--, SEEK_END);
    $char = fgetc($f);
}

fclose($f);

echo $line;

Lưu ý rằng giải pháp này sẽ lặp lại ký tự cuối cùng của dòng trừ khi tệp của bạn kết thúc trong một dòng mới. Nếu tệp của bạn không kết thúc trong một dòng mới, bạn có thể thay đổi cả hai phiên bản của


$fp = fopen(".....");
fseek($fp, -1, SEEK_END); 
$pos = ftell($fp);
$LastLine = "";
// Loop backword util "\n" is found.
while((($C = fgetc($fp)) != "\n") && ($pos > 0)) {
    $LastLine = $C.$LastLine;
    fseek($fp, $pos--);
}
fclose($fp);
4 thành

$fp = fopen(".....");
fseek($fp, -1, SEEK_END); 
$pos = ftell($fp);
$LastLine = "";
// Loop backword util "\n" is found.
while((($C = fgetc($fp)) != "\n") && ($pos > 0)) {
    $LastLine = $C.$LastLine;
    fseek($fp, $pos--);
}
fclose($fp);
5.

Đã trả lời ngày 2 tháng 10 năm 2009 lúc 15:26Oct 2, 2009 at 15:26

Ionuț G. Stanionuț G. StanIonuț G. Stan

Phim thương hiệu vàng 172K1818 gold badges187 silver badges199 bronze badges

9

Sử dụng FSEEK. Bạn tìm kiếm vị trí cuối cùng và tìm kiếm nó lùi (sử dụng ftell để cho biết vị trí hiện tại) cho đến khi bạn tìm thấy "\ n".


$fp = fopen(".....");
fseek($fp, -1, SEEK_END); 
$pos = ftell($fp);
$LastLine = "";
// Loop backword util "\n" is found.
while((($C = fgetc($fp)) != "\n") && ($pos > 0)) {
    $LastLine = $C.$LastLine;
    fseek($fp, $pos--);
}
fclose($fp);

Lưu ý: Tôi đã không được kiểm tra. Bạn có thể cần một số điều chỉnh.

Cập nhật: Cảm ơn


$fp = fopen(".....");
fseek($fp, -1, SEEK_END); 
$pos = ftell($fp);
$LastLine = "";
// Loop backword util "\n" is found.
while((($C = fgetc($fp)) != "\n") && ($pos > 0)) {
    $LastLine = $C.$LastLine;
    fseek($fp, $pos--);
}
fclose($fp);
6 vì đã chỉ ra về tệp trống.

:-D

Update2: Đã sửa lỗi một lỗi cú pháp khác, thiếu dấu chấm phẩy tại


$fp = fopen(".....");
fseek($fp, -1, SEEK_END); 
$pos = ftell($fp);
$LastLine = "";
// Loop backword util "\n" is found.
while((($C = fgetc($fp)) != "\n") && ($pos > 0)) {
    $LastLine = $C.$LastLine;
    fseek($fp, $pos--);
}
fclose($fp);
7

Hướng dẫn how do i read the last line of a text file in php? - làm cách nào để đọc dòng cuối cùng của tệp văn bản trong php?

Daan

7.4155 Huy hiệu vàng41 Huy hiệu bạc52 Huy hiệu đồng5 gold badges41 silver badges52 bronze badges

Đã trả lời ngày 2 tháng 10 năm 2009 lúc 15:19Oct 2, 2009 at 15:19

Hướng dẫn how do i read the last line of a text file in php? - làm cách nào để đọc dòng cuối cùng của tệp văn bản trong php?

1

Bạn đang tìm kiếm chức năng FSEEK. Có các ví dụ làm việc về cách đọc dòng cuối cùng của một tệp trong phần bình luận ở đó.

Đã trả lời ngày 2 tháng 10 năm 2009 lúc 15:16Oct 2, 2009 at 15:16

sliktsssliktsslikts

7,7871 Huy hiệu vàng27 Huy hiệu bạc45 Huy hiệu đồng1 gold badge27 silver badges45 bronze badges

Đây là mã của Ionuț G. StanIonuț G. Stan

Tôi đã sửa đổi mã của bạn một chút và biến nó thành một chức năng cho khả năng tái sử dụng

function read_last_line ($file_path){



$line = '';

$f = fopen($file_path, 'r');
$cursor = -1;

fseek($f, $cursor, SEEK_END);
$char = fgetc($f);

/**
* Trim trailing newline chars of the file
*/
while ($char === "\n" || $char === "\r") {
    fseek($f, $cursor--, SEEK_END);
    $char = fgetc($f);
}

/**
* Read until the start of file or first newline char
*/
while ($char !== false && $char !== "\n" && $char !== "\r") {
    /**
     * Prepend the new char
     */
    $line = $char . $line;
    fseek($f, $cursor--, SEEK_END);
    $char = fgetc($f);
}

return $line;
}

echo read_last_line ('log.txt');

Bạn sẽ nhận được dòng cuối cùng đó

Đã trả lời ngày 30 tháng 6 năm 2014 lúc 5:09Jun 30, 2014 at 5:09

Nếu bạn biết giới hạn trên của chiều dài dòng, bạn có thể làm một cái gì đó như thế này.

$maxLength = 1024;
$fp = fopen('somefile.txt', 'r');
fseek($fp, -$maxLength , SEEK_END); 
$fewLines = explode("\n", fgets($fp, $maxLength));
$lastLine = $fewLines[count($fewLines) - 1];

Để đáp ứng với Chỉnh sửa: Fopen chỉ cần xử lý tệp (nghĩa là đảm bảo rằng nó tồn tại, quy trình có sự cho phép, cho phép HĐH biết một quy trình đang sử dụng tệp, v.v.). Trong ví dụ này, chỉ có 1024 ký tự từ tệp sẽ được đọc vào bộ nhớ.: fopen just acquires a handle to the file (i.e. make sure it exists, process has permission, lets os know a process is using the file, etc...). In this example only 1024 characters from the file will be read into memory.

Đã trả lời ngày 2 tháng 10 năm 2009 lúc 15:31Oct 2, 2009 at 15:31

Lawrence Barsantilawrence BarsantiLawrence Barsanti

30.6K10 Huy hiệu vàng46 Huy hiệu bạc67 Huy hiệu Đồng10 gold badges46 silver badges67 bronze badges

2

Vấn đề của bạn trông giống với cái này

Cách tiếp cận tốt nhất để tránh tải toàn bộ tệp vào bộ nhớ dường như là:

$file = escapeshellarg($file); // for the security concious (should be everyone!)
$line = `tail -n 1 $file`;

Đã trả lời ngày 2 tháng 10 năm 2009 lúc 15:17Oct 2, 2009 at 15:17

James Goodwinjames GoodwinJames Goodwin

7.2803 Huy hiệu vàng29 Huy hiệu bạc41 Huy hiệu đồng3 gold badges29 silver badges41 bronze badges

3

Có thể tối ưu hóa điều này từ phía bên kia không? Nếu vậy, chỉ cần để ứng dụng ghi nhật ký luôn đăng nhập dòng vào một tệp trong khi cắt ngắn nó (tức là> thay vì >>)

Một số tối ưu hóa có thể đạt được bằng cách "đoán" mặc dù, chỉ cần mở tệp và với chiều rộng dòng nhật ký trung bình, bạn có thể đoán được dòng cuối cùng sẽ ở đâu. Nhảy đến vị trí đó với FSEEK và tìm dòng cuối cùng.

Đã trả lời ngày 2 tháng 10 năm 2009 lúc 15:12Oct 2, 2009 at 15:12

WolphwolphWolph

75,8K10 Huy hiệu vàng132 Huy hiệu bạc147 Huy hiệu đồng10 gold badges132 silver badges147 bronze badges

1

Mã chưa được kiểm tra từ các bình luận của http://php.net/manual/en/function.fseek.php

jim at lfchosting dot com 05-Nov-2003 02:03
Here is a function that returns the last line of a file.  This should be quicker than reading the whole file till you get to the last line.  If you want to speed it up a bit, you can set the $pos = some number that is just greater than the line length.  The files I was dealing with were various lengths, so this worked for me. 

Đã trả lời ngày 24 tháng 3 năm 2011 lúc 1:10Mar 24, 2011 at 1:10

Hướng dẫn how do i read the last line of a text file in php? - làm cách nào để đọc dòng cuối cùng của tệp văn bản trong php?

Lỗi lỗi cú phápSyntax Error

4.3752 Huy hiệu vàng21 Huy hiệu bạc33 Huy hiệu Đồng2 gold badges21 silver badges33 bronze badges

Đây là giải pháp của tôi chỉ với một vòng lặp

        $line = '';
        $f = fopen($file_path, 'r');
        $cursor = 0 ;
        do  {
            fseek($f, $cursor--, SEEK_END);
            $char = fgetc($f);
            $line = $char.$line;
        } while (
                $cursor > -1 || (
                 ord($char) !== 10 &&
                 ord($char) !== 13
                )
        );

Đã trả lời ngày 10 tháng 6 năm 2016 lúc 12:32Jun 10, 2016 at 12:32

Caiofiorcaiofiorcaiofior

3893 Huy hiệu bạc16 Huy hiệu Đồng3 silver badges16 bronze badges

Dưới đây là một bản tổng hợp các câu trả lời ở đây được gói thành một hàm có thể chỉ định có bao nhiêu dòng nên được trả về.

function getLastLines($path, $totalLines) {
  $lines = array();

  $fp = fopen($path, 'r');
  fseek($fp, -1, SEEK_END);
  $pos = ftell($fp);
  $lastLine = "";

  // Loop backword until we have our lines or we reach the start
  while($pos > 0 && count($lines) < $totalLines) {

    $C = fgetc($fp);
    if($C == "\n") {
      // skip empty lines
      if(trim($lastLine) != "") {
        $lines[] = $lastLine;
      }
      $lastLine = '';
    } else {
      $lastLine = $C.$lastLine;
    }
    fseek($fp, $pos--);
  }

  $lines = array_reverse($lines);

  return $lines;
}

Đã trả lời ngày 3 tháng 10 năm 2016 lúc 16:00Oct 3, 2016 at 16:00

DynamicDandynamicdanDynamicDan

4214 Huy hiệu bạc12 Huy hiệu đồng4 silver badges12 bronze badges

Hàm này sẽ cho phép bạn đọc dòng cuối cùng hoặc (tùy chọn) toàn bộ dòng tệp từ cuối, bằng cách vượt qua


$fp = fopen(".....");
fseek($fp, -1, SEEK_END); 
$pos = ftell($fp);
$LastLine = "";
// Loop backword util "\n" is found.
while((($C = fgetc($fp)) != "\n") && ($pos > 0)) {
    $LastLine = $C.$LastLine;
    fseek($fp, $pos--);
}
fclose($fp);
8 sẽ cho biết nơi bắt đầu đọc một tệp từ cuối (số nguyên âm).

function file_read_last_line($file, $initial_pos = -1) {
  $fp = is_string($file) ? fopen($file, 'r') : $file;
  $pos = $initial_pos;
  $line = '';
  do {
    fseek($fp, $pos, SEEK_END);
    $char = fgetc($fp);
    if ($char === false) {
      if ($pos === $initial_pos) return false;
      break;
    }
    $pos = $pos - 1;
    if ($char === "\r" || $char === "\n") continue;
    $line = $char . $line;
  } while ($char !== "\n");
  if (is_string($file)) fclose($file);
  return $line;
}

Sau đó, để đọc dòng cuối cùng:

$last_line = file_read_last_line('/path/to/file');

Để đọc toàn bộ dòng tệp theo từng dòng từ cuối:


$fp = fopen(".....");
fseek($fp, -1, SEEK_END); 
$pos = ftell($fp);
$LastLine = "";
// Loop backword util "\n" is found.
while((($C = fgetc($fp)) != "\n") && ($pos > 0)) {
    $LastLine = $C.$LastLine;
    fseek($fp, $pos--);
}
fclose($fp);
0

Đã trả lời ngày 7 tháng 6 năm 2020 lúc 7:41Jun 7, 2020 at 7:41

artnikproartnikproartnikpro

5.1354 Huy hiệu vàng35 Huy hiệu bạc38 Huy hiệu đồng4 gold badges35 silver badges38 bronze badges

1

Traverse lùi một đoạn tệp của đoạn, dừng sau khi tìm một dòng mới và trả về mọi thứ sau lần "\ n" cuối cùng.


$fp = fopen(".....");
fseek($fp, -1, SEEK_END); 
$pos = ftell($fp);
$LastLine = "";
// Loop backword util "\n" is found.
while((($C = fgetc($fp)) != "\n") && ($pos > 0)) {
    $LastLine = $C.$LastLine;
    fseek($fp, $pos--);
}
fclose($fp);
1

Bạn có thể xác định độ dài của phần thân của bạn.

Nhỏ nhỏ hơn = Sử dụng bộ nhớ nhỏ hơn, lặp lại nhiều hơn.

Chunk lớn hơn = Sử dụng bộ nhớ lớn hơn, ít lặp hơn.

Đã trả lời ngày 14 tháng 4 năm 2021 lúc 14:23Apr 14, 2021 at 14:23

Hướng dẫn how do i read the last line of a text file in php? - làm cách nào để đọc dòng cuối cùng của tệp văn bản trong php?

Donovan Pdonovan pDonovan P

4924 Huy hiệu bạc6 Huy hiệu đồng4 silver badges6 bronze badges

Làm cách nào để đọc một tập tin cuối cùng?

Để xem xét một vài dòng cuối cùng của một tệp, hãy sử dụng lệnh đuôi.Đuôi hoạt động theo cách tương tự như đầu: gõ đuôi và tên tệp để xem 10 dòng cuối cùng của tệp đó hoặc nhập tên tệp Đuôi để xem các dòng số cuối cùng của tệp.Hãy thử sử dụng đuôi để nhìn vào năm dòng cuối cùng của bạn.use the tail command. tail works the same way as head: type tail and the filename to see the last 10 lines of that file, or type tail -number filename to see the last number lines of the file. Try using tail to look at the last five lines of your .

Làm thế nào để bạn đọc dòng cuối cùng của một tệp văn bản trong Python?

Cách đọc dòng cuối cùng của một tập tin trong Python..
Vòng lặp qua từng dòng trong tệp ..
Bỏ qua từng dòng cho đến khi bạn đạt đến dòng cuối cùng ..
Lưu dòng cuối cùng trong bộ nhớ ..

Làm cách nào để đếm số lượng dòng trong tệp PHP?

$ filePath = "test. txt";$ lines = Count (Tệp ($ FilePath));$lines = count (file( $filePath ));