Как эффективно работать, где файл ломается от другой более ранней версии? - PullRequest
1 голос
/ 18 октября 2010

У меня есть файл, который постоянно добавляется (процесс вне моего контроля), и я записываю этот файл каждые x секунд.Я хочу извлечь новое содержимое файла (добавлено между моими предыдущими записями) и работать с ним.К сожалению, файлу нечего обозначать, когда он был добавлен в последний раз, и я не могу записать в этот файл, поэтому мой единственный вариант - сохранить в файле то, что я уже знаю, и сравнить его с новой версией, которая у меня есть..

Теперь мне нужно знать как Я могу лучше всего это сделать.Я использую PHP, и я решил, что самое простое решение - просто сохранить предыдущее содержимое и затем использовать explode(), чтобы выяснить, что будет после него, это (вполне очевидно) ужасное решение, поскольку, когда файл достигает больших чисел (1 ГБ +)) это будет адский процесс.

У меня была идея сохранить положение последнего символа, а затем работать оттуда, например, если последний символ был 100-м, я бы работал с 100-м символом в следующем процессе, ноЯ не уверен, как я мог бы сделать это, или если это вообще возможно с PHP.

Так что мой вопрос в том, каков правильный способ сделать это, и как я могу сделать это сPHP (если это возможно)?Функции или общая идея хороши, я хорош для реализации, но не уверен в теории, стоящей за этим.

1 Ответ

2 голосов
/ 18 октября 2010

При условии, что файл просто добавляется, было бы интуитивно проще сохранить предыдущий размер файла и использовать fseek() или параметр смещения file_get_contents для перемещения туда, где заканчивалась старая версия файла.Т.е.:

$old_position = (int)file_get_contents("last_position.temp");
file_put_contents("last_position.temp", filesize("thebigfile.txt"));

// There might be an off-by-one error here that I'm not paying attention to
$new_entry = file_get_contents("thebigfile.txt", false, "r", $old_position);

Чтобы получить этот ролл в первый раз, вам нужно поставить 0 в last_position.temp, чтобы не было ошибок или обид.

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...