2015-07-10 2 views
1

Вход посетителей на одном из моих сайтов просто потерял всех посетителей. Он работает полтора года, но все записи были потеряны за одну ночь. Страница журнала здесь (если вы посетите одну из страниц сайта, ваша информация будет добавлена ​​в журнал): http://mykindred.com/dalton/hoax/viewlog.phpПредельная длина массива - отказ?

журнал хранится в текстовом файле ($ имя_файла), который должен ограничить до $ maxloglines = 300. $ logline содержит нового посетителя, который будет добавлен в журнал. Код, который генерирует журнал:

$lines = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); 
$logline .= implode("\n", array_slice($lines, 0, $maxloglines)); 
file_put_contents($filename, $logline); 

Любые предложения относительно того, почему мой журнал потеряет свои данные? У меня есть ошибка кодирования?

+0

Возможно ли, что у вас в журнале есть дополнительные разрывы строк? Был ли файл опустошен полностью или было 300 пустых строк? – davids3

+0

Возможно, вы пытались читать, возможно, писали? Вероятно, вы должны заблокировать файл, чтобы предотвратить это. См. Примечания о режиме «c»: http://php.net/manual/en/function.fopen.php –

+0

@ davids3 Показанный код удаляет пустые строки, и вчера журнал был заполнен (т.е. имел 300 записей) , – tcloud

ответ

0

При записи файлов с помощью file_put_contents, вы, по сути, используя ряд fopen(), fwrite() и fclose(), где файл открыт в режиме файла w:

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

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

Вместо этого, вы должны использовать опцию LOCK_EX, чтобы обеспечить исключительную блокировку файла во время записи:

file_put_contents($filename, $logline, LOCK_EX); 

Вы можете прочитать больше о том, что в в документации flock().