За последние 24 часа нас посетили 23012 программистов и 1227 роботов. Сейчас ищут 690 программистов ...

Хранить в файле только последние 1000 строк

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

  1. IvanKut

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

    С нами с:
    27 июл 2018
    Сообщения:
    258
    Симпатии:
    0
    Приветствую
    Записываю в фаил с новой строчки json_encode string.
    С какого периода в файлах накапливается больтшое кол-во строк, а мне нужны только 1000 последних
    Посоветуйте плиз, как правильней решить вопрос очистки не нужных строк?
     
  2. twim32

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

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
  3. IvanKut

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

    С нами с:
    27 июл 2018
    Сообщения:
    258
    Симпатии:
    0
    @twim32 Понял идею. Есть ли готовые функции, которые из файла могут считывать строки как массив?
    Либо считать сначало фаил а потом explode?
     
  4. twim32

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

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    Может быть это какие-то новые технологии, которые пока не дошли до меня, но в моём понимании вы создали проблему и пытаетесь ее решить.
    Почему бы вам просто не хранить всё в массиве? 1000 объектов для json обычно не проблема
    PHP:
    1. $max = 3; // максимум объектов
    2.  
    3. $data = [
    4.     0 => ['a'],
    5.     1 => ['b'],
    6.     2 => ['c'],
    7.     3 => ['d'],
    8. ];
    9.  
    10.  
    11. $data[] = ['new_value'];
    12. $count = count($data);
    13.  
    14. if( $count > $max ) {
    15.     $data = array_slice($data, $count - $max, $max);
    16. }
    17.  
    18. var_dump($data);
     
  5. IvanKut

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

    С нами с:
    27 июл 2018
    Сообщения:
    258
    Симпатии:
    0
    @twim32 поясню. Мне прилетают каждую минуту данные на api. Я их рассортировываю на файлы и записываю.
    Прилетает по 1 строчке в запросе! Я дописываю в фаил их.
    Потом хочу раз в сутки ротировать файлы, удаляя не нужные строчки из файла.

    Пока как я считаю, у меня идея как и у Вас не совсем оптимальная
    1 - Считать каждый фаил
    2 - Поделить на строчки(получить массив)
    3 - Оставить последние 1000 и перезаписать фаил.

    Так вот, вопрос(просьба о совете), может быть есть файловая функция(аналог array_slice) - которая может посчитать кол-во строк в файле, и сделать перезапись с нужным кол-вом строк.

    Ваше решение правильное. Просто может реально проще через файловые функции, если нет, то благодарю за помощь!
     
  6. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    Код (Text):
    1. $file = "file.txt";
    2. $data = file($file);
    3. $line = $data[count($data)-1000];
    но проблема в том что если у вас большие файлы может не хватить памяти для такой обработки...
    конечно удобнее всего все что прилетает хранить в БД а потом раз в сутки сохранять последние 1000 записей в файл и очищать БД...

    или же если этот вариант не подходит то в linux есть утилита tail... она выводит нужное количество последних строк строк
    Код (Text):
    1. tail -1000 /var/log/messages
    выполнять ее и сохранять результаты выполнения..
    --- Добавлено ---
    ПС вот нагуглил https://gist.github.com/ain/1894692
    Код (Text):
    1. <?php
    2.  
    3. // full path to text file
    4. define("TEXT_FILE", "/home/www/default-error.log");
    5. // number of lines to read from the end of file
    6. define("LINES_COUNT", 10);
    7. function read_file($file, $lines) {
    8.     //global $fsize;
    9.     $handle = fopen($file, "r");
    10.     $linecounter = $lines;
    11.     $pos = -2;
    12.     $beginning = false;
    13.     $text = array();
    14.     while ($linecounter > 0) {
    15.         $t = " ";
    16.         while ($t != "\n") {
    17.             if(fseek($handle, $pos, SEEK_END) == -1) {
    18.                 $beginning = true;
    19.                 break;
    20.             }
    21.             $t = fgetc($handle);
    22.             $pos --;
    23.         }
    24.         $linecounter --;
    25.         if ($beginning) {
    26.             rewind($handle);
    27.         }
    28.         $text[$lines-$linecounter-1] = fgets($handle);
    29.         if ($beginning) break;
    30.     }
    31.     fclose ($handle);
    32.     return array_reverse($text);
    33. }
    34. $fsize = round(filesize(TEXT_FILE)/1024/1024,2);
    35. echo "<strong>".TEXT_FILE."</strong>\n\n";
    36. echo "File size is {$fsize} megabytes\n\n";
    37. echo "Last ".LINES_COUNT." lines of the file:\n\n";
    38. $lines = read_file(TEXT_FILE, LINES_COUNT);
    39. foreach ($lines as $line) {
    40.     echo $line;
    41. }
    42. ?>
     
    twim32 нравится это.
  7. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    еще одна идея)
    1. Что то прилетело
    2. Открыли файл, он открылся построчно как массив..
    3. Проверили количество элементов в массиве
    4. Если 1000 и больше удалили лишнее и оставили 999
    5. Добавили запись
    6. Сохранили запись..
    тогда в файле всегда будет 1000 записей или меньше)