![]() |
защита от одновременной записи в файл
Напомните мне, плиз, как сделать сабж.
Есть файлик, который очень часто читается и в который не реже все пишется... так вот очень не хотелось бы потерять данные из него. Помню что-то про flock(), но не помню что и как :( Заранее сенькс :) |
$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); выдрал из мануала |
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.
|
if(flock($fp, LOCK_EX)) imho он сразу отпустит
|
Stasik
Значит, как я понимаю, просто пишем так: PHP код:
|
При использовании 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() |
мне б на пхп :)
|
sanchos
тогда не знаю :rolleyes: |
все равно пасиб ;)
|
Хм. все равно обнулил :(
Есть какой-нить другой способ защиты? |
mysql? ;)
|
Imeetsya w widu hranenie dannih w mysql ili sinhra failowih deskriptorow cherez mysql (eto kak togda???)?.
|
хранение данных в mysql
|
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).
|
Stasik
А если нет поддержки MySQL? Нужно средствами пхп... :( |
Da, widat dostali uje stasika ;-)o.
|
Вот чего нашлось туточки:
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; } ==================================== Сам ничего не проверял. |
WMRomik
Вот, пасиб :) Буду разбираться. Идею саму понял, может сам чего забацаю :) |
Часовой пояс GMT +4, время: 01:48. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.