использование flock()

cdi

Новичок
использование flock()

PHP:
/*Здравствуйте
Использование flock() Дмитрий Котеров предлогает сл. образом (на примере счётчика)
*/
$f=fopen('counter.dat','a+');
flock($f,LOCK_EX);           // Говорим, что дальше будем работать только мы
$count=fread($f,100);        // Читаем значение, сохраненное в файле
@$count=$count+1;            // Увеличиваем его на 1 (пустая строка = 0)
ftruncate($f,0);             // Стираем файл
fwrite($f,$count);           // Записываем новое значение
fflush($f);                  // Сбрасываем файловый буфер
flock($f,LOCK_UN);           // Отключаемся от блокировки
fclose($f);                  // Закрываем файл
echo $count;                 // Печатаем величину счетчика

/* А если мне НЕ нужно производить какие-либо манипуляции с имеющимися данными в файле , т.е. считывать значение и увеличивать его. Мне просто необходимо дописать новые данные и ВСЁ. Применение такого алгоритма насколлько правильно ?*/
$open = ('counter.dat','a+');
flock($open,LOCK_EX);
fwrite ($open, $new_data."\r\n");
flock($open,LOCK_UN);
fclose ($open);
/*
1) Можно ли такое применить при написании гостевой, только неверное при использовании разделяемой блокировки ? Или я совсем неправильно мыслю?
2) применяется ли flock() для директорий ?
*/
 

Demiurg

Guest
>Применение такого алгоритма насколлько правильно ?
надо пологать, что если работает, то правильный

> Или я совсем неправильно мыслю?
правильно

> применяется ли flock() для директорий ?
нет

еще можно использовать субд, с ними легче.
 

voodoo

Новичок
fflush($open); я бы все-таки добавил перед flock($open,LOCK_UN);

кроме того (для первого примера от Д.К.),
существует мнение что сначала делать truncate и потом писать -- медленнее чем сначала перместиться в 0 (seek), потом писать и потом делать truncate до текущего положения.
(причина в том что truncate освобождает блоки, потом они снова выделяются для записи данных)
 

lucas

Guest
Мысли далее мало относятся к реализации простого текстового счетчика.

ftruncate($f,0); // Стираем файл
fwrite($f,$count); // Записываем новое значение
Наоборот -- сначала записать данные, потом сделать транкейт по их длине.
На это /me однажды указали местные старожилы. :)
Дескать, это более оптимизированно.

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

-~{}~ 30.06.04 18:06:

Классно получилось...
 

cdi

Новичок
Originally posted by Demiurg
>Применение такого алгоритма насколлько правильно ?
надо пологать, что если работает, то правильный
Во всяком случае под виндовс ошибок не наблюдал, а под *nix так же будет или нет?
 
Сверху