У меня есть простой класс 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).
Каков наилучший подход для удаления начала файла без особого беспокойства по поводу производительности? Я предполагаю, что чтение файла построчно в другой файл кэша происходит медленно, особенно если запись в журнал происходит довольно часто. Есть ли лучший способ?
Подход, который я использовал в прошлом для такого рода простого регистратора, заключается в том, чтобы иметь стандартный размер записи. Затем я использую этот стандартный размер записи вместе с индексом записи, чтобы вычислить смещение файла, куда записывать запись журнала.
Обычно я использую первую запись, содержащую индекс текущей записи, в котором следует поместить следующую запись, за которой следует запятая, а затем максимальное количество записей.
Итак, основная логика
fseek()
к этому моменту и написать записьfseek()
к первой записи и обновлению индексной записиГлавное, чтобы у вас была полная, пустая или заполненная пробелом запись правильного размера, чтобы все ваши смещения записей совпали, а когда вы просматриваете файл в текстовом редакторе, это весь текст. Также убедитесь, что новая строка находится в конце записи, чтобы ее было легко просматривать, и каждая запись находится на новой строке в средстве просмотра текста, будь то редактор или другое приложение, такое как веб-браузер.
Наконец, как часть приращения выполните модуль для принудительного переключения, так как вы хотите, чтобы он был циклическим буфером. Просто убедитесь, что вы добавляете единицу, так как вы хотите, чтобы ваш индекс был от 1 до n (где n — максимальное количество записей), потому что запись 0, первая запись, используется для хранения текущего индекса и максимального количества записей.
Механизм открытия, поиска, записи и закрытия файла с помощью PHP см. PHP добавляется в файл с определенной позиции.
Других решений пока нет …