+ + +
С нами с 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);
}
|
|
|
|
full-plastic programmist
С нами с 05.09.03
Сообщения: 8361
Рейтинг: 4779
|
Добавлено: 25/08/05 в 16:35 |
когда то давно столкнулся с такой же фигней - не помню уже точно, но в итоге решил только дописывать в файл - а раз в сутки перезаписывать другим скриптом...
|
|
вот соскучился по мастеру...
|
0
|
|
|
С нами с 09.02.03
Сообщения: 549
Рейтинг: 195
|
Добавлено: 26/08/05 в 11:30 |
В перле лочка файла чисто рекомендательная. То-есть, если один скрипт файл лочит, а второй тупо кладет на это - второму скрипту ничего не помешает делать с файлом что угодно.
Как вариант можно работать с промежуточным файлом, по окончании переименовывая его в основной, но это тоже черевато. Если модификация файла происходит более-менее часто (скажем, чаще чем раз в минуту) - лучше через БД решать.
|
|
|
|
С нами с 22.03.05
Сообщения: 58
Рейтинг: 47
|
Добавлено: 26/08/05 в 13:25 |
Можно создавать lock файл при запуске скрипта и уберать его при завершении. Если второй скрипт обнаруживает этот lock файл - ждать пока он не исчезнет в течении N секунд. Но это тоже не лучший вариант при нестабильном скрипте или большой нагрузке.
|
|
|
|
Cкриптоманьяк
С нами с 14.09.00
Сообщения: 1181
Рейтинг: 245
|
Добавлено: 26/08/05 в 13:37 |
Вообще, насколько я помню, переменная экслюзивной блокировки пишется не FLOCK_EX, а LOCK_EX (может в этом ошибка? хотя скорее всего это мое предположение неправильное. Но проверь на всяк случ, у меня по перлу под рукой ничего нет)
Во-вторых, никогда не пользуйся при конкурентной записи режимом открытия на полную запись, только на дозапись. Иначе, как ни лочь, все равно файлы будут портиться.
|
|
|
|
Раздаю инвайты, ищу линк-трейд
С нами с 20.08.04
Сообщения: 16675
Рейтинг: 8593
|
Добавлено: 26/08/05 в 13:38 |
вот-вот. Лочу только через семафоры (так вроде в учебниках называется). Работает везде. Но геморно
Вообще только при переездах с хоста на хост понимаешь, как писАть, чтобы работало везде без постоянных перетирок с саппортами. В свое время даже от файлов с хэшами пришлось отказаться, и хранить просто в текстовых файлах уже не помню по какой причине
|
|
|
|
Cкриптоманьяк
С нами с 14.09.00
Сообщения: 1181
Рейтинг: 245
|
Добавлено: 26/08/05 в 13:45 |
Нет, семафоры при работе с файлами это избыточное усложнение, достаточно обычной блокировки, просто надо юзать всегда только дозапись. Если юзать полную перезапись файла, то там получается что система файл удаляет в момент открытия, то есть ДО блокировки, и если в момент между открытием и блокировкой к файлу дернется другой процесс, то он получит нарушеные данные ну и соответственно все идет по пизде.
|
|
|
|
Раздаю инвайты, ищу линк-трейд
С нами с 20.08.04
Сообщения: 16675
Рейтинг: 8593
|
Добавлено: 26/08/05 в 13:54 |
Ясно. Мне перезапись нужна. Хотя можно подумать и о дозаписи с последующей выборкой, пересчетом и тп.
А вообще что критичнее: дозапись, при которых файл распухает постепенно (типа получение всего файла будет занимать много времени) или получить свод, поменять все, что нужно, и перезаписать маленький файл.
Ну если об объемах - то несколько К в сутки - файл типа логов - сколько, с какого домена, ну и мелочи - что, куда, сколько раз нажал, браузер, есть ли куки, скрипты - со статистикой за неделю, ну или день.
Конкретных цифр нет, но и конкретного ответа не жду.
Ответ типа: основное время в перле тратится на открытие файла, а его дальнейшее чтение - это уже копейки - устроил бы. Не буквально - а просто инфа нужна для размышления
|
|
|
|
С нами с 22.03.05
Сообщения: 58
Рейтинг: 47
|
Добавлено: 26/08/05 в 14:21 |
Xrenoder писал: | Нет, семафоры при работе с файлами это избыточное усложнение, достаточно обычной блокировки, просто надо юзать всегда только дозапись. Если юзать полную перезапись файла, то там получается что система файл удаляет в момент открытия, то есть ДО блокировки, и если в момент между открытием и блокировкой к файлу дернется другой процесс, то он получит нарушеные данные ну и соответственно все идет по пизде. |
Сам понимаешь, все зависит от объёма файла с которым работаешь. Если будет файл, те же логи, на десятки гиг, то дозапись с последующей обработкой будет менее эффективной чем тот же семафор с перезаписью :-)
P.S. http://perl.about.com/cs/intermediateperl/a/022704.htm
|
|
|
|
+ + +
С нами с 01.08.03
Сообщения: 421
Рейтинг: 103
|
Добавлено: 26/08/05 в 16:12 |
Всем спасибо за ответы. Ясно теперь, что по-человечески ничего не сделаешь. Видимо, сделаю через БД.
Ещё один вариант, более быстрый чем БД - это запуск сервера, чтобы к файлу статистики только он обращался, а все остальные процессы просто к нему обращаются и просят поправить файл статов. Тем более, при таком варианте можно всю статистику держать в памяти и периодически скидывать в файл. Но этот вариант сложный, там явно проблем и багов возникнет куча, так что его оставлю на потом, когда понадобиться разруливать 100к+ трафа
|
|
|
|