Реклама на сайте Advertise with us

Не получается залочить файл (Perl)

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:
+ + +


С нами с 01.08.03
Сообщения: 421
Рейтинг: 103

Ссылка на сообщениеДобавлено: 25/08/05 в 16:23       Ответить с цитатойцитата 

Этот фрагмент скрипта открывает файл статистики, считывает, обнуляет файл, записывает в файл обновлённую статистику.

Беда в том, что иногда файл статистики этим скриптом портится. Похоже на то, что два процесса пишут в этот файл одновременно (например, два почти одновременных клика), чего быть не должно, файл ведь залочен!

Пожалуйста, подскажите, в чём может быть дело.

if(open(F,"+>> ${statfilename}"))
{
flock(F, FLOCK_EX);
seek(F, 0, SEEK_SET);
read(F, $infile, 1000000);

@statarray = ....
.........................
seek(F, 0, SEEK_SET);
truncate(F, 0);
print(F join("|", @statarray));
F->autoflush(1);
close(F);
}

0
 

full-plastic programmist

С нами с 05.09.03
Сообщения: 8361
Рейтинг: 4779

Ссылка на сообщениеДобавлено: 25/08/05 в 16:35       Ответить с цитатойцитата 

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

вот соскучился по мастеру...

0
 



С нами с 09.02.03
Сообщения: 549
Рейтинг: 195

Ссылка на сообщениеДобавлено: 26/08/05 в 11:30       Ответить с цитатойцитата 

В перле лочка файла чисто рекомендательная. То-есть, если один скрипт файл лочит, а второй тупо кладет на это - второму скрипту ничего не помешает делать с файлом что угодно.

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

0
 



С нами с 22.03.05
Сообщения: 58
Рейтинг: 47

Ссылка на сообщениеДобавлено: 26/08/05 в 13:25       Ответить с цитатойцитата 

Можно создавать lock файл при запуске скрипта и уберать его при завершении. Если второй скрипт обнаруживает этот lock файл - ждать пока он не исчезнет в течении N секунд. Но это тоже не лучший вариант при нестабильном скрипте или большой нагрузке.

0
 

Cкриптоманьяк

С нами с 14.09.00
Сообщения: 1181
Рейтинг: 245

Ссылка на сообщениеДобавлено: 26/08/05 в 13:37       Ответить с цитатойцитата 

Вообще, насколько я помню, переменная экслюзивной блокировки пишется не FLOCK_EX, а LOCK_EX (может в этом ошибка? хотя скорее всего это мое предположение неправильное. Но проверь на всяк случ, у меня по перлу под рукой ничего нет)

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

0
 

Раздаю инвайты, ищу линк-трейд

С нами с 20.08.04
Сообщения: 16675
Рейтинг: 8593


Передовик Master-X (16.11.2006) Передовик Master-X (01.09.2019)
Ссылка на сообщениеДобавлено: 26/08/05 в 13:38       Ответить с цитатойцитата 

вот-вот. Лочу только через семафоры (так вроде в учебниках называется). Работает везде. Но геморно icon_smile.gif
Вообще только при переездах с хоста на хост понимаешь, как писАть, чтобы работало везде без постоянных перетирок с саппортами. В свое время даже от файлов с хэшами пришлось отказаться, и хранить просто в текстовых файлах уже не помню по какой причине icon_sad.gif

Кому ссылку?
RU и EN Dating

0
 

Cкриптоманьяк

С нами с 14.09.00
Сообщения: 1181
Рейтинг: 245

Ссылка на сообщениеДобавлено: 26/08/05 в 13:45       Ответить с цитатойцитата 



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

0
 

Раздаю инвайты, ищу линк-трейд

С нами с 20.08.04
Сообщения: 16675
Рейтинг: 8593


Передовик Master-X (16.11.2006) Передовик Master-X (01.09.2019)
Ссылка на сообщениеДобавлено: 26/08/05 в 13:54       Ответить с цитатойцитата 

Ясно. Мне перезапись нужна. Хотя можно подумать и о дозаписи с последующей выборкой, пересчетом и тп.
А вообще что критичнее: дозапись, при которых файл распухает постепенно (типа получение всего файла будет занимать много времени) или получить свод, поменять все, что нужно, и перезаписать маленький файл.

Ну если об объемах - то несколько К в сутки - файл типа логов - сколько, с какого домена, ну и мелочи - что, куда, сколько раз нажал, браузер, есть ли куки, скрипты - со статистикой за неделю, ну или день.

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

Кому ссылку?
RU и EN Dating

0
 



С нами с 22.03.05
Сообщения: 58
Рейтинг: 47

Ссылка на сообщениеДобавлено: 26/08/05 в 14:21       Ответить с цитатойцитата 

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

Сам понимаешь, все зависит от объёма файла с которым работаешь. Если будет файл, те же логи, на десятки гиг, то дозапись с последующей обработкой будет менее эффективной чем тот же семафор с перезаписью :-)

P.S. http://perl.about.com/cs/intermediateperl/a/022704.htm

0
 
+ + +


С нами с 01.08.03
Сообщения: 421
Рейтинг: 103

Ссылка на сообщениеДобавлено: 26/08/05 в 16:12       Ответить с цитатойцитата 

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

Ещё один вариант, более быстрый чем БД - это запуск сервера, чтобы к файлу статистики только он обращался, а все остальные процессы просто к нему обращаются и просят поправить файл статов. Тем более, при таком варианте можно всю статистику держать в памяти и периодически скидывать в файл. Но этот вариант сложный, там явно проблем и багов возникнет куча, так что его оставлю на потом, когда понадобиться разруливать 100к+ трафа icon_smile.gif

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »