Так как у хостера отсутствует возможность использования MySQL, я написал скрипт для записи и чтения данных из файлов (по прямым ссылкам файлы нельзя просмотреть).
Проблема следующая: при дозаписи в файл следующей строки (пример):
\nКод|Код 2|Код3|Иногда происходит "затирание" первой строки файла.
То есть строка записывается нормально, в конец - как и должна, но при этом стирается перая строка файла.
Данная проблема происходит не каждый раз, а примерно один в 15-20 раз.
Файл имеет следующую структуру (обозначил с переводами строк):
\n
|Код 1|Код 2|Код 3|\n
|Код 1|Код 2|Код 3|\n
|Код 1|Код 2|Код 3|
Дозапись пробовал производить с помощью функции put_contents(), а также с помощью fwrite с заданным режимом "a".
Не могу понять почему происходить "затирание" первой строки.
К скрипту обращаются часто. Был вариант, что скрипт не успевает сохранить изменённый файл, как к нему снова делают запрос - но в таком случае бы просто не записывалась вторая строка (из второго запрса). Почему удаляется именно первая строка файла мне непонятно.
Помогите, пожалуйста, решить данную проблему.
Спасибо!
Спустя 25 минут, 2 секунды (1.10.2011 - 18:02) Winston написал(а):
Вот так
file_put_contents('file.txt', $data . "\r\n", FILE_APPEND);
Спустя 2 минуты, 38 секунд (1.10.2011 - 18:05) Guest написал(а):
Winston, да, да. Я так и делал (забыл "file_"). Строки также затируются, как и при использовании fwrite с режимом "a".
Спустя 5 минут, 58 секунд (1.10.2011 - 18:11) Winston написал(а):
Guest
Я же добавил FILE_APPEND, теперь не должно перезатиратся.
Я же добавил FILE_APPEND, теперь не должно перезатиратся.
Спустя 1 минута, 26 секунд (1.10.2011 - 18:12) Guest написал(а):
Winston, конечно, я и использовал с FILE_APPEND (просто в первом посте указал только название функции, без параметров).
Спустя 44 секунды (1.10.2011 - 18:13) bodja написал(а):
а читаем как?
Спустя 4 минуты, 29 секунд (1.10.2011 - 18:17) Guest написал(а):
bodja, через file(). Это не имеет значения. Строки удаляются именно при записи.
Спустя 4 минуты, 54 секунды (1.10.2011 - 18:22) Winston написал(а):
Цитата (Guest @ 1.10.2011 - 18:17) |
через file(). Это не имеет значения. Строки удаляются именно при записи |
А ты знаешь, что возвращает ф-я file() ?
Лучше тогда использовать file_get_contents()
Спустя 5 минут, 27 секунд (1.10.2011 - 18:28) bodja написал(а):
Цитата |
А ты знаешь, что возвращает ф-я file() ? |
Правильно,ф-я file() возвращает массив.
![biggrin.gif](http://phpforum.ru/html/emoticons/biggrin.gif)
тут скорее всего проблемы с формированием массива перед записью.
Спустя 12 минут, 5 секунд (1.10.2011 - 18:40) Guest написал(а):
Я знаю, что она массив возращает. Мне и нужно массив, т. к. в дальнейшем необходимо работать со строками, как с элементами массива.
Спустя 43 секунды (1.10.2011 - 18:41) Guest написал(а):
Я ничего не формирую. Я использую лишь дозапись (то есть текущее содержимое файла не трогаю).
Спустя 1 минута, 22 секунды (1.10.2011 - 18:42) Winston написал(а):
Покажи свой код.
Спустя 2 минуты, 47 секунд (1.10.2011 - 18:45) Guest написал(а):
$n = func_num_args();
$data = "";
for($i=1;$i<$n;$i++) {$data.= func_get_arg($i)."|u|";}; // Преобразуем данные в нужный формат
file_put_contents($path,"\n".$data, FILE_APPEND | FILE_BINARY);
return '1';
Спустя 26 минут, 21 секунда (1.10.2011 - 19:11) bodja написал(а):
Обьясните как вот это
Цитата |
Я ничего не формирую. Я использую лишь дозапись |
состыковать с вот этим.
Цитата |
Мне и нужно массив, т. к. в дальнейшем необходимо работать со строками, как с элементами массива |
Если вам нужно чтото в массив добавить используйте array_push и потом сохраняйте file_put_contents
Спустя 12 часов, 21 минута, 50 секунд (2.10.2011 - 07:33) Guest написал(а):
bodja, я получаю из файла массив, чтобы работать с ним в дальнейшем (вывести данные).
Когда необходимо записать данные файл, весь файл я не перезаписываю (то есть при записи я не работаю с текущим содержимым файла), я делаю лишь дозапись одной строки.
Первая строка удаляется именно при дозаписи строки в файл.
Когда необходимо записать данные файл, весь файл я не перезаписываю (то есть при записи я не работаю с текущим содержимым файла), я делаю лишь дозапись одной строки.
Первая строка удаляется именно при дозаписи строки в файл.
Спустя 1 час, 25 минут, 22 секунды (2.10.2011 - 08:58) bodja написал(а):
Если используется только дозапись,то потерятся не может,
по крайней мере у меня такого небыло никогда,
Возможно может быть причина если разная кодировка вашего файла с данными и скрипта.
по крайней мере у меня такого небыло никогда,
Возможно может быть причина если разная кодировка вашего файла с данными и скрипта.
Спустя 1 день, 2 часа, 50 минут, 25 секунд (3.10.2011 - 11:49) Guest написал(а):
bodja, пока не знаю, возможно.
У файла, где хранятся данные была кодировку UTF-8 без BOM, а у скрипта просто UTF-8.
BOM, я так понимаю, это информация в начале файла. Может быть, что из-за отсутствия (без BOM) этой информации и удалялись первые строки?
Я сейчас сменил кодировку на UTF-8 - посмотрим, что будет.
У файла, где хранятся данные была кодировку UTF-8 без BOM, а у скрипта просто UTF-8.
BOM, я так понимаю, это информация в начале файла. Может быть, что из-за отсутствия (без BOM) этой информации и удалялись первые строки?
Я сейчас сменил кодировку на UTF-8 - посмотрим, что будет.
Спустя 4 часа, 57 минут, 18 секунд (3.10.2011 - 16:46) Guest написал(а):
Поставил кодировку - UTF-8 (с BOM) - строки всё-равно стираются.