PHP - Возврат последней строки в файле?

Все, что мы кодируем в Java, входит в класс. Всякий раз, когда мы запускаем класс, JVM создает объект. JVM может создавать несколько объектов, по определению Static означает, что у вас одинаковый набор копий для всех объектов.

Таким образом, если бы Java позволяла верхнему классу быть статичным при каждом запуске программы, она создает объект и продолжает переопределять одно и то же место в памяти.

Если вы просто заменяете объект каждый раз, когда запускаете его, какой смысл его создавать?

Так вот почему Java избавилась от статики для класса верхнего уровня.

Могут быть и более конкретные причины, но для меня это логично.

16
задан waxical 30 June 2009 в 09:34
поделиться

6 ответов

Простейшее наивное решение просто:

$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`;
42
ответ дан 30 November 2019 в 15:08
поделиться

Если вы хотите прочитать файл построчно, функция файл считывает содержимое файла построчно и возвращает каждую строку как элемент массива.

Таким образом, вы можете сделать что-то простое, например:

$lines    = file('log.txt');
$lastLine = array_pop($lines);
0
ответ дан 30 November 2019 в 15:08
поделиться
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.

8
ответ дан 30 November 2019 в 15:08
поделиться

Похоже, это именно то, что вы ищете:

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;
}
14
ответ дан 30 November 2019 в 15:08
поделиться

Вы должны либо прочитать файл построчно, и сохранить последнюю прочитанную строку, чтобы получить его.

Или, если в unix / linux, вы можете рассмотреть возможность использования хвоста команды оболочки

tail -n 1 filename
3
ответ дан 30 November 2019 в 15:08
поделиться

Этот не прерывается для файлов с 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;
}
1
ответ дан 30 November 2019 в 15:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: