Все, что мы кодируем в Java, входит в класс. Всякий раз, когда мы запускаем класс, JVM создает объект. JVM может создавать несколько объектов, по определению Static означает, что у вас одинаковый набор копий для всех объектов.
Таким образом, если бы Java позволяла верхнему классу быть статичным при каждом запуске программы, она создает объект и продолжает переопределять одно и то же место в памяти.
Если вы просто заменяете объект каждый раз, когда запускаете его, какой смысл его создавать?
Так вот почему Java избавилась от статики для класса верхнего уровня.
Могут быть и более конкретные причины, но для меня это логично.
Простейшее наивное решение просто:
$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`;
Если вы хотите прочитать файл построчно, функция файл
считывает содержимое файла построчно и возвращает каждую строку как элемент массива.
Таким образом, вы можете сделать что-то простое, например:
$lines = file('log.txt');
$lastLine = array_pop($lines);
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);
This is better, since it does not load the complete file into memory...
Set YOUR_EOL to your correct line endings, if you use the same line endings as the default line endings of the OS where your script resides, you could use the constant PHP_EOL.
Похоже, это именно то, что вы ищете:
tekkie.flashbit.net: Функциональность хвоста в PHP
Он реализует функцию, которая использует fseek () с отрицательным index, чтобы свернуть файл с конца. Вы можете указать, сколько строк вы хотите вернуть.
Код также доступен в виде 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;
}
Вы должны либо прочитать файл построчно, и сохранить последнюю прочитанную строку, чтобы получить его.
Или, если в unix / linux, вы можете рассмотреть возможность использования хвоста команды оболочки
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;
}