imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Веб-мастеру > Веб-программирование
Опции темы
Старый 11.11.2003, 17:13     # 1
sanchos
::VIP::
Художник-2004
 
Аватар для sanchos
 
Регистрация: 04.11.2002
Адрес: Питер
Сообщения: 1 604

sanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэй
защита от одновременной записи в файл

Напомните мне, плиз, как сделать сабж.
Есть файлик, который очень часто читается и в который не реже все пишется... так вот очень не хотелось бы потерять данные из него.
Помню что-то про flock(), но не помню что и как
Заранее сенькс
sanchos вне форума  
Старый 12.11.2003, 17:23     # 2
Stasik
Registered User
 
Аватар для Stasik
 
Регистрация: 27.03.2002
Адрес: дома
Сообщения: 1 660

Stasik Известность не заставит себя ждатьStasik Известность не заставит себя ждать
$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);


выдрал из мануала
__________________
Всё будет хорошо!
Stasik вне форума  
Старый 12.11.2003, 17:54     # 3
helldomain
Administrator
 
Аватар для helldomain
 
Регистрация: 13.05.2002
Сообщения: 11 227

helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
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.
__________________
Осколки прошлого, как снег, закрутит ураган времён,
В ушедший день для нас навек, обрушив мост,
Оставив в наших душах след, тьма уплывёт за горизонт,
И в чистом небе вспыхнет свет, свет новых звёзд.
helldomain вне форума  
Старый 13.11.2003, 00:07     # 4
Stasik
Registered User
 
Аватар для Stasik
 
Регистрация: 27.03.2002
Адрес: дома
Сообщения: 1 660

Stasik Известность не заставит себя ждатьStasik Известность не заставит себя ждать
if(flock($fp, LOCK_EX)) imho он сразу отпустит
__________________
Всё будет хорошо!
Stasik вне форума  
Старый 18.11.2003, 10:30     # 5
sanchos
::VIP::
Художник-2004
 
Аватар для sanchos
 
Регистрация: 04.11.2002
Адрес: Питер
Сообщения: 1 604

sanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэй
Stasik
Значит, как я понимаю, просто пишем так:
PHP код:
flock($fpLOCK_EX)
fwrite($fp"data");
flock($fpLOCK_UN); 
Во время записи файл заблокирован. Если в это время производится параллельная запись, то она будлет поставлена в очередь или будет проигнорирована?
sanchos вне форума  
Старый 18.11.2003, 11:44     # 6
f00rd
::VIP::
 
Аватар для f00rd
 
Регистрация: 11.06.2003
Адрес: Там...
Сообщения: 236

f00rd Популярный человек на этом форумеf00rd Популярный человек на этом форумеf00rd Популярный человек на этом форумеf00rd Популярный человек на этом форумеf00rd Популярный человек на этом форумеf00rd Популярный человек на этом форумеf00rd Популярный человек на этом форумеf00rd Популярный человек на этом форуме
При использовании 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()
f00rd вне форума  
Старый 18.11.2003, 11:45     # 7
sanchos
::VIP::
Художник-2004
 
Аватар для sanchos
 
Регистрация: 04.11.2002
Адрес: Питер
Сообщения: 1 604

sanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэй
мне б на пхп
sanchos вне форума  
Старый 18.11.2003, 11:46     # 8
f00rd
::VIP::
 
Аватар для f00rd
 
Регистрация: 11.06.2003
Адрес: Там...
Сообщения: 236

f00rd Популярный человек на этом форумеf00rd Популярный человек на этом форумеf00rd Популярный человек на этом форумеf00rd Популярный человек на этом форумеf00rd Популярный человек на этом форумеf00rd Популярный человек на этом форумеf00rd Популярный человек на этом форумеf00rd Популярный человек на этом форуме
sanchos
тогда не знаю
f00rd вне форума  
Старый 18.11.2003, 13:11     # 9
sanchos
::VIP::
Художник-2004
 
Аватар для sanchos
 
Регистрация: 04.11.2002
Адрес: Питер
Сообщения: 1 604

sanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэй
все равно пасиб
sanchos вне форума  
Старый 24.11.2003, 12:45     # 10
sanchos
::VIP::
Художник-2004
 
Аватар для sanchos
 
Регистрация: 04.11.2002
Адрес: Питер
Сообщения: 1 604

sanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэй
Хм. все равно обнулил
Есть какой-нить другой способ защиты?
sanchos вне форума  
Старый 24.11.2003, 17:14     # 11
Stasik
Registered User
 
Аватар для Stasik
 
Регистрация: 27.03.2002
Адрес: дома
Сообщения: 1 660

Stasik Известность не заставит себя ждатьStasik Известность не заставит себя ждать
mysql?
__________________
Всё будет хорошо!
Stasik вне форума  
Старый 24.11.2003, 17:27     # 12
helldomain
Administrator
 
Аватар для helldomain
 
Регистрация: 13.05.2002
Сообщения: 11 227

helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
Imeetsya w widu hranenie dannih w mysql ili sinhra failowih deskriptorow cherez mysql (eto kak togda???)?.
__________________
Осколки прошлого, как снег, закрутит ураган времён,
В ушедший день для нас навек, обрушив мост,
Оставив в наших душах след, тьма уплывёт за горизонт,
И в чистом небе вспыхнет свет, свет новых звёзд.
helldomain вне форума  
Старый 25.11.2003, 01:57     # 13
Stasik
Registered User
 
Аватар для Stasik
 
Регистрация: 27.03.2002
Адрес: дома
Сообщения: 1 660

Stasik Известность не заставит себя ждатьStasik Известность не заставит себя ждать
хранение данных в mysql
__________________
Всё будет хорошо!
Stasik вне форума  
Старый 25.11.2003, 03:11     # 14
helldomain
Administrator
 
Аватар для helldomain
 
Регистрация: 13.05.2002
Сообщения: 11 227

helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
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).
__________________
Осколки прошлого, как снег, закрутит ураган времён,
В ушедший день для нас навек, обрушив мост,
Оставив в наших душах след, тьма уплывёт за горизонт,
И в чистом небе вспыхнет свет, свет новых звёзд.
helldomain вне форума  
Старый 25.11.2003, 09:12     # 15
sanchos
::VIP::
Художник-2004
 
Аватар для sanchos
 
Регистрация: 04.11.2002
Адрес: Питер
Сообщения: 1 604

sanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэй
Stasik
А если нет поддержки MySQL? Нужно средствами пхп...
sanchos вне форума  
Старый 25.11.2003, 09:41     # 16
helldomain
Administrator
 
Аватар для helldomain
 
Регистрация: 13.05.2002
Сообщения: 11 227

helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
helldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиургhelldomain Демиург
Da, widat dostali uje stasika ;-)o.
__________________
Осколки прошлого, как снег, закрутит ураган времён,
В ушедший день для нас навек, обрушив мост,
Оставив в наших душах след, тьма уплывёт за горизонт,
И в чистом небе вспыхнет свет, свет новых звёзд.
helldomain вне форума  
Старый 25.11.2003, 10:15     # 17
WMRomik
Full Member
 
Аватар для WMRomik
 
Регистрация: 25.11.2001
Адрес: Moscow. Russia
Пол: Male
Сообщения: 573

WMRomik СэнсэйWMRomik СэнсэйWMRomik СэнсэйWMRomik СэнсэйWMRomik СэнсэйWMRomik СэнсэйWMRomik СэнсэйWMRomik СэнсэйWMRomik СэнсэйWMRomik СэнсэйWMRomik СэнсэйWMRomik СэнсэйWMRomik Сэнсэй
Вот чего нашлось туточки:

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
WMRomik вне форума  
Старый 25.11.2003, 13:12     # 18
sanchos
::VIP::
Художник-2004
 
Аватар для sanchos
 
Регистрация: 04.11.2002
Адрес: Питер
Сообщения: 1 604

sanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэйsanchos Сэнсэй
WMRomik
Вот, пасиб Буду разбираться. Идею саму понял, может сам чего забацаю
sanchos вне форума  

Опции темы

Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 01:48.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.