Я предполагаю, что это fgets, но я не могу найти конкретный синтаксис. Я пытаюсь читать (в строке, о которой я думаю, проще), последняя строка добавлена в файл журнала.
Простейшим наивным решением является просто:
$file = "/path/to/file"; $data = file($file); $line = $data[count($data)-1];
Хотя, это будет загружать весь файл в память. Возможно, проблема (или нет). Лучшим решением является следующее:
$file = escapeshellarg($file); // for the security concious (should be everyone!) $line = `tail -n 1 $file`;
Похоже, это то, что вы ищете:
tekkie.flashbit.net: Хвост в PHP
Он реализует функцию, которая использует fseek () с отрицательным индексом для свертывания файла с конца. Вы можете определить, сколько строк вы хотите вернуть.
Код также доступен как Gist на GitHub :
// full path to text file define("TEXT_FILE", "/home/www/default-error.log"); // number of lines to read from the end of file define("LINES_COUNT", 10); function read_file($file, $lines) { //global $fsize; $handle = fopen($file, "r"); $linecounter = $lines; $pos = -2; $beginning = false; $text = array(); while ($linecounter > 0) { $t = " "; while ($t != "\n") { if(fseek($handle, $pos, SEEK_END) == -1) { $beginning = true; break; } $t = fgetc($handle); $pos --; } $linecounter --; if ($beginning) { rewind($handle); } $text[$lines-$linecounter-1] = fgets($handle); if ($beginning) break; } fclose ($handle); return array_reverse($text); } $fsize = round(filesize(TEXT_FILE)/1024/1024,2); echo "<strong>".TEXT_FILE."</strong>\n\n"; echo "File size is {$fsize} megabytes\n\n"; echo "Last ".LINES_COUNT." lines of the file:\n\n"; $lines = read_file(TEXT_FILE, LINES_COUNT); foreach ($lines as $line) { echo $line; }
define('YOUR_EOL', "\n"); $fp = fopen('yourfile.txt', 'r'); $pos = -1; $line = ''; $c = ''; do { $line = $c . $line; fseek($fp, $pos--, SEEK_END); $c = fgetc($fp); } while ($c != YOUR_EOL); echo $line; fclose($fp);
Это лучше, так как он не загружает полный файл в память …
Установите YOUR_EOL в свои правильные окончания строк, если вы используете те же окончания строк, что и окончания строк по умолчанию для ОС, где находится ваш скрипт, вы можете использовать константу PHP_EOL.
function seekLastLine($f) { $pos = -2; do { fseek($f, $pos--, SEEK_END); $ch = fgetc($f); } while ($ch != "\n"); }
-2
потому что последний символ может быть \n
Вам нужно либо прочитать файл в строковой последовательности, либо сохранить последнюю прочитанную строку, чтобы получить ее.
Или, если в unix / linux вы можете использовать команду shell tail
tail -n 1 filename
Этот файл не будет разбит на 1 или 0 файл строки.
function readlastline($fileName) { $fp = @fopen($fileName, "r"); $begining = fseek($fp, 0); $pos = -1; $t = " "; while ($t != "\n") { fseek($fp, $pos, SEEK_END); if(ftell($fp) == $begining){ break; } $t = fgetc($fp); $pos = $pos - 1; } $t = fgets($fp); fclose($fp); return $t; }
… Зачем просто читать последнюю строку?
function readLines($fp, $num) { $line_count = 0; $line = ''; $pos = -1; $lines = array(); $c = ''; while($line_count < $num) { $line = $c . $line; fseek($fp, $pos--, SEEK_END); $c = fgetc($fp); if($c == "\n") { $line_count++; $lines[] = $line; $line = ''; $c = ''; } } return $lines; } $filename = "content.txt"; $fp = @fopen($filename, "r"); print_r(readLines($fp, 2)); fclose($fp);
Если вы хотите прочитать файл строки за строкой, функция file
считывает содержимое файла по строке и возвращает каждую строку как элемент массива.
Таким образом, вы могли бы сделать что-то простое:
$lines = file('log.txt'); $lastLine = array_pop($lines);