За последние 24 часа нас посетили 21366 программистов и 1380 роботов. Сейчас ищут 700 программистов ...

Вывести последние строки файла

Тема в разделе "PHP для новичков", создана пользователем MrSullex, 21 апр 2020.

  1. MrSullex

    MrSullex Активный пользователь

    С нами с:
    15 сен 2015
    Сообщения:
    122
    Симпатии:
    1
    Здравствуйте. Есть код:
    PHP:
    1. $file = file('file.txt');
    2. for ($i = max(0, count($file)-101); $i < count($file); $i++) {
    3.   echo $file[$i];
    4. }
    Он выводит 100 последних строк файла. Но перед этим он полностью загружает файл и если файл много весит, код просто не обработается из за ограничений PHP. Как вывести только последние 100 строк файла с минимальным потерями? (и желательно минимальным кодом)
     
  2. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Делить фаил на дни, file_21_04_2020.txt
     
  3. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @MrSullex, может при таком раскладе пора посмотреть в сторону БД?
    --- Добавлено ---
    @Artur_hopf, странный совет )
     
    qdevelopment нравится это.
  4. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @Valick ну я могу только гадать что там внутри, но ощущение что какие то логи.
    вот по этой цитате так думается.
     
  5. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Artur_hopf, ну разбил ты файлы по дням, за сегодня у тебя прилетело 25 строк, а тебе надо вывести 100.
    Или еще хуже позавчера 100, вчера 17, сегодня 25, а надо 100 ...
     
  6. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    PHP:
    1. $lines = [];
    2.  
    3. foreach (new SPLFileObject("file.txt") as $line) {
    4.     $lines[] = $line;
    5.     if (count($lines) > 100) array_shift($lines);
    6. }
    7.  
    8. echo implode($lines);
     
  7. iceblood

    iceblood Активный пользователь

    С нами с:
    20 фев 2020
    Сообщения:
    83
    Симпатии:
    12
    PHP:
    1. <?php
    2.     /*
    3.      * Вывводит последние 100 строк из файла.
    4.      */
    5.     $fileName = "file.txt";
    6.     $handle = fopen($fileName, "r");
    7.     $posOffset = 0;
    8.     //  Устанавливаем смещение в файловом указателе
    9.     fseek($handle, $posOffset, SEEK_END);  //SEEK_END в конец файла
    10.     $numLastLines = 100;
    11.     $newlineCount = 0;
    12.     do {
    13.         fseek($handle, --$posOffset, SEEK_END);
    14.         if (fgetc($handle) == "\n") {
    15.             $newlineCount++;
    16.             if ($newlineCount == $numLastLines) {
    17.                 /* Выводит все оставшиеся данные из файлового указателя */
    18.                 fpassthru($handle);
    19.             }
    20.         }
    21.     } while (ftell($handle) > 1);
    22.  
    23.     fclose($handle);
    От себя не по теме добавлю, если задача парсить логи на *nix-сервере, рекомендую использовать для просмотра последних 100 строк из файла команду: tail -n 100 file.txt
    https://ru.wikipedia.org/wiki/Tail
    Консольные утилиты работают не сравнимо быстрее php скриптов, что становиться заметно на больших объемах данных.
     
  8. iceblood

    iceblood Активный пользователь

    С нами с:
    20 фев 2020
    Сообщения:
    83
    Симпатии:
    12
    еще я забыл поставить
    PHP:
    1.                 fpassthru($handle);
    2.                 break;