Приветствую Записываю в фаил с новой строчки json_encode string. С какого периода в файлах накапливается больтшое кол-во строк, а мне нужны только 1000 последних Посоветуйте плиз, как правильней решить вопрос очистки не нужных строк?
@twim32 Понял идею. Есть ли готовые функции, которые из файла могут считывать строки как массив? Либо считать сначало фаил а потом explode?
Может быть это какие-то новые технологии, которые пока не дошли до меня, но в моём понимании вы создали проблему и пытаетесь ее решить. Почему бы вам просто не хранить всё в массиве? 1000 объектов для json обычно не проблема PHP: $max = 3; // максимум объектов $data = [ 0 => ['a'], 1 => ['b'], 2 => ['c'], 3 => ['d'], ]; $data[] = ['new_value']; $count = count($data); if( $count > $max ) { $data = array_slice($data, $count - $max, $max); } var_dump($data);
@twim32 поясню. Мне прилетают каждую минуту данные на api. Я их рассортировываю на файлы и записываю. Прилетает по 1 строчке в запросе! Я дописываю в фаил их. Потом хочу раз в сутки ротировать файлы, удаляя не нужные строчки из файла. Пока как я считаю, у меня идея как и у Вас не совсем оптимальная 1 - Считать каждый фаил 2 - Поделить на строчки(получить массив) 3 - Оставить последние 1000 и перезаписать фаил. Так вот, вопрос(просьба о совете), может быть есть файловая функция(аналог array_slice) - которая может посчитать кол-во строк в файле, и сделать перезапись с нужным кол-вом строк. Ваше решение правильное. Просто может реально проще через файловые функции, если нет, то благодарю за помощь!
Код (Text): $file = "file.txt"; $data = file($file); $line = $data[count($data)-1000]; но проблема в том что если у вас большие файлы может не хватить памяти для такой обработки... конечно удобнее всего все что прилетает хранить в БД а потом раз в сутки сохранять последние 1000 записей в файл и очищать БД... или же если этот вариант не подходит то в linux есть утилита tail... она выводит нужное количество последних строк строк Код (Text): tail -1000 /var/log/messages выполнять ее и сохранять результаты выполнения.. --- Добавлено --- ПС вот нагуглил https://gist.github.com/ain/1894692 Код (Text): <?php // 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; } ?>
еще одна идея) 1. Что то прилетело 2. Открыли файл, он открылся построчно как массив.. 3. Проверили количество элементов в массиве 4. Если 1000 и больше удалили лишнее и оставили 999 5. Добавили запись 6. Сохранили запись.. тогда в файле всегда будет 1000 записей или меньше)