Как обрезать файл в начале в PHP?

У меня есть простой класс logger, написанный на PHP. Файл, в который он пишет, должен иметь максимальный размер. Я знаю, что могу обрезать файл с ftruncate($filename, $size), но это удаляет контент в конце. Так что я хотел бы сделать следующее:

if(filesize($filename) > $mySize) {
//remove X bytes at BEGINNING of $filename
}

// append log message
$handle = fopen($filename, 'a+');
if($handle !== false) {
fwrite($handle, $myMessage);
fclose($handle);
}

Таким образом, журнал «прокручивает» файл с течением времени, вместо того, чтобы расти до бесконечности (и, в конце концов, падает на 2 ГБ, signed int предел PHP).

Каков наилучший подход для удаления начала файла без особого беспокойства по поводу производительности? Я предполагаю, что чтение файла построчно в другой файл кэша происходит медленно, особенно если запись в журнал происходит довольно часто. Есть ли лучший способ?

4

Решение

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

Обычно я использую первую запись, содержащую индекс текущей записи, в котором следует поместить следующую запись, за которой следует запятая, а затем максимальное количество записей.

Итак, основная логика

  • проверить, существует ли файл журнала, если не инициализировать индекс записи и максимальные значения индекса
  • при добавлении записи прочитайте первую запись, чтобы получить текущий индекс и максимальный индекс
  • вычислить смещение файла и fseek() к этому моменту и написать запись
  • увеличить текущий индекс, fseek() к первой записи и обновлению индексной записи
  • закрыть файл

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

Наконец, как часть приращения выполните модуль для принудительного переключения, так как вы хотите, чтобы он был циклическим буфером. Просто убедитесь, что вы добавляете единицу, так как вы хотите, чтобы ваш индекс был от 1 до n (где n — максимальное количество записей), потому что запись 0, первая запись, используется для хранения текущего индекса и максимального количества записей.

Механизм открытия, поиска, записи и закрытия файла с помощью PHP см. PHP добавляется в файл с определенной позиции.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]