блокировка файла

gmc008

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

С.

Продвинутый новичок
Шансы на глюки зависят от того, как часто поступают запросов и как долго происходит запись (длина данных). Если глюкнет, может о фиг с ним? (отладочный лог). Сам факт, что данные пишутся не в базу, а в файл скорее говорит о их неважности.

Только вам принимать решение.
 

gmc008

Новичок
данные достаточно важные, запросов как раз много и странно что еще ни разу не заглючило. Размер ну не больше 500 байт. Записываются все за один вызов fwrite, может из-за этого и не проблем?
 

Фанат

oncle terrible
Команда форума
мне кажется, при добавлении не должно быть проблем.
 

С.

Продвинутый новичок
С одной стороны 500 байт -- это немного. А с другой стороны -- никто гарантии не даст.
 

radioheaded

PHP нуб
Если вы просто открываете файл для записи, пишете туда что-то и тут же закрываете, то я бы посоветовал вам file_put_contents с FILE_APPEND. Она делает все то же самое, но если вдруг вам понадобится блокировка, то нужно будет только добавить LOCK_EX к флагам.
 

radioheaded

PHP нуб
radioheaded, а она понадобится?
Вопрос к автору топика.

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

MiksIr

miksir@home:~$
Насколько я помню в юникс системах одна операция записи размером в пределах страницы памяти (4К) атомарна. Т.е. если пишете не более 4К - ничего блокировать не нужно.
 

WMix

герр M:)ller
Партнер клуба
Насколько я помню в юникс системах одна операция записи размером в пределах страницы памяти (4К) атомарна. Т.е. если пишете не более 4К - ничего блокировать не нужно.
gut zu wissen (хорошо знать *нем)
 

Фанат

oncle terrible
Команда форума
radioheaded
Вообще-то, это был вопрос, который он задал.

Я очень не люблю топики, в которых сначала из ничего высасывается проблема, а потом подтягиваются и доброхоты с решением.
 

gmc008

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

Dovg

Продвинутый новичок
file_put_contents с FILE_APPEND. Она делает все то же самое, но если вдруг вам понадобится блокировка, то нужно будет только добавить LOCK_EX к флагам.
btw, там сейчас в документации ошибка - LOCK_EX одновременно с FILE_APPEND использовать не имеет смысла.
 

Dovg

Продвинутый новичок
Почему? При любых размерах данных?
В документации пишут

file_put_contents($file, $person, FILE_APPEND | LOCK_EX);

А в сорце написано:
if (flags & PHP_FILE_APPEND) {
mode[0] = 'a';
} else if (flags & LOCK_EX) {

Т.е. если указать оба флага, то использоваться будет только FILE_APPEND, если я правильно читаю.
 
Сверху