imho.ws |
![]() |
![]() |
![]() |
# 1 |
::VIP::
Художник-2004 Регистрация: 04.11.2002
Адрес: Питер
Сообщения: 1 604
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
защита от одновременной записи в файл
Напомните мне, плиз, как сделать сабж.
Есть файлик, который очень часто читается и в который не реже все пишется... так вот очень не хотелось бы потерять данные из него. Помню что-то про flock(), но не помню что и как ![]() Заранее сенькс ![]() |
![]() |
![]() |
# 2 |
Registered User
Регистрация: 27.03.2002
Адрес: дома
Сообщения: 1 660
![]() ![]() |
$fp = fopen("/tmp/lock.txt", "w+");
if (flock($fp, LOCK_EX)) { // do an exclusive lock fwrite($fp, "Write something here\n"); flock($fp, LOCK_UN); // release the lock } else { echo "Couldn't lock the file !"; } fclose($fp); выдрал из мануала
__________________
Всё будет хорошо! |
![]() |
![]() |
# 3 |
Administrator
Регистрация: 13.05.2002
Сообщения: 11 227
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Wse hotel zadat wopros! Dannij primer ispolzowaniya flock(), esli ukazannij fail uje blokirowann, on zastawlyaet process/thread jdat poka ekskliuziwnoe blokirowanie ne pereidet k nemu ili srazu wibrasiwaet error.
__________________
Осколки прошлого, как снег, закрутит ураган времён, В ушедший день для нас навек, обрушив мост, Оставив в наших душах след, тьма уплывёт за горизонт, И в чистом небе вспыхнет свет, свет новых звёзд. |
![]() |
![]() |
# 5 |
::VIP::
Художник-2004 Регистрация: 04.11.2002
Адрес: Питер
Сообщения: 1 604
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Stasik
Значит, как я понимаю, просто пишем так: PHP код:
|
![]() |
![]() |
# 6 |
::VIP::
Регистрация: 11.06.2003
Адрес: Там...
Сообщения: 236
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
При использовании flock лучше всего использовать так называемые семафоры, например:
#!/usr/bin/perl -w use Fcntl qw(:flock); $sem = "/tmp/sem.sem"; sub get_lock { open(SEM, ">$sem") || die "Невозможно создать семафор: $!"; flock(SEM, LOCK_EX) || die "Невозможно заблокировать семафор: $!" } sub release_lock { close(SEM); } get_lock(); # ожидает бесконечно долго, до снятия защиты... ... #Операции ... release_lock() |
![]() |
![]() |
# 12 |
Administrator
Регистрация: 13.05.2002
Сообщения: 11 227
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Imeetsya w widu hranenie dannih w mysql ili sinhra failowih deskriptorow cherez mysql (eto kak togda???)?.
__________________
Осколки прошлого, как снег, закрутит ураган времён, В ушедший день для нас навек, обрушив мост, Оставив в наших душах след, тьма уплывёт за горизонт, И в чистом небе вспыхнет свет, свет новых звёзд. |
![]() |
![]() |
# 14 |
Administrator
Регистрация: 13.05.2002
Сообщения: 11 227
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Nu da, soglasen, mysql wse sinhroniziruet ot i do (nu a kak eshe), no est takie weschi, kotorie w mysql ne polojish (ne tehnicheski daje, a po logike proekta).
__________________
Осколки прошлого, как снег, закрутит ураган времён, В ушедший день для нас навек, обрушив мост, Оставив в наших душах след, тьма уплывёт за горизонт, И в чистом небе вспыхнет свет, свет новых звёзд. |
![]() |
![]() |
# 16 |
Administrator
Регистрация: 13.05.2002
Сообщения: 11 227
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Da, widat dostali uje stasika ;-)o.
__________________
Осколки прошлого, как снег, закрутит ураган времён, В ушедший день для нас навек, обрушив мост, Оставив в наших душах след, тьма уплывёт за горизонт, И в чистом небе вспыхнет свет, свет новых звёзд. |
![]() |
![]() |
# 17 |
Full Member
Регистрация: 25.11.2001
Адрес: Moscow. Russia
Пол: Male
Сообщения: 573
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Вот чего нашлось туточки:
http://wmasteram.h10.ru/articles/php...l=counter.html =========================== Наиболее интересным моментом в работе счетчика является защита данных от "порчи" при применении "многопоточных" интернет-серверов. В документации по PHP ясно дается понять, что применять "штатную" функцию flock() для блокирования лог файлов нецелесообразно. Поэтому пришлось выдумать свою, пускай и несколько наивную, схему блокировки. Смысл ее состоит в следующем: для каждого лог-файла, для которого существует возможность одновременной записи и чтения информации, до записи создается id файл . После записи он уничтожается. Если "второй" процесс заметил существование такого файла, то он ждет 1с на его уничтожение. Подобное реализуется в следующей функции: function is_month_lock() <--- есть есть id, файл возвращает 1, иначе - 0 function month_lock() <--- Создает ид файл function month_unlock() <--- Уничтожает id файл function write_m($str) { $i=0; $write_ok=0; while ($i<20 && $write_ok==0) <--- Всего 20 циклов ожидания уничтожения файла { if (!$this->is_month_lock()) { $this->month_lock(); $lf=$GLOBALS['counter_log_month']; $fp = fopen ($lf,"a+"); fwrite($fp,$str); fflush($fp); fclose($fp); $this->month_unlock(); $write_ok=1; } else { usleep(50000); <--- Один цикл ожидания $i++; } } if ($write_ok!=1)$this->month_unlock(); <--- Защита от "сбойного" поведения PHP. Для спокойствия (на медленных серверах) можете увеличить количество периодов до 100 шт. return $write_ok; } ==================================== Сам ничего не проверял.
__________________
Ничто не даётся нам с таким трудом, как то, что не даётся. Best regards! 2008 © Roman V. Brooks |
![]() |