Файлы и паралельное вып. скриптов

b0bah1

Новичок
Файлы и паралельное вып. скриптов

Кто знает какие медоты защиты от файлов при использовании их скриптами довольно часто.
Ну что б не пересекались такие операции как запись/чтение.

Я нашел/придумал довольно неплохой способ, но он работает не всегда.
Связан он с rename().

В цикле
PHP:
while (!rename(ОСНОВНОЙ_ФАЙЛ,ВРЕМЕННЫЙ ФАЙЛ)){
  usleep(1000);
}
Ждет пока не будет переименован файл, если цикл сработал, ведется работа с файлом.
Потом вконце идет переименования файла обратно.

Впринципе все хорошо, но все равно бывают такие моменты когда работа почему то пересекается, даже при 100
одновременных использований.

Какие методы еще возможно использовать?
 

DiMA

php.spb.ru
Команда форума
+адын

мда.. придумал велосипед (неработающий) на пустом месте
 

b0bah1

Новичок
Я нормального примера с flock не нашел. Везде возможно паралельно открыть файл, блокировка идет уже после открытия.
 

zerkms

TDD infected
Команда форума
Я нормального примера с flock не нашел.
да в общем-то всё точно так же как и у тебя. тоже установка лока в цикле, тоже проверка, что файл не залочен в условии выхода из цикла.
 

SiMM

Новичок
> Везде возможно паралельно открыть файл, блокировка идет уже после открытия.
А что страшного в том, что между fopen и flock файл не залочен, если никаких других действий с файлом между этими операциями не выполняется?
 

dimagolov

Новичок
Кто знает какие медоты защиты от файлов при использовании их скриптами довольно часто.
Ну что б не пересекались такие операции как запись/чтение.
может тебе нужна база а не файлы для таких задач?
 

fixxxer

К.О.
Партнер клуба
>А что страшного в том, что между fopen и flock файл не залочен, если никаких других действий с файлом между этими операциями не выполняется?

смотря какой второй аргумент у fopen ;)
 

b0bah1

Новичок
Надо сначала залочить файл, потом считать переменные какое какие, некоторые нарастить и записать в файл обратно. После этого файлом может пользоваться другой скрипт.
 

SiMM

Новичок
b0bah1, ну и чем flock не устраивает для решения этой задачи? Открывайте файл на чтение и запись (r+/a+).
 

fixxxer

К.О.
Партнер клуба
открываешь файл а+
лочишь эксклюзивно
fseek в начало
читаешь
обрабатываешь
опять fseek в начало и ftruncate(0)
записываешь
разлочиваешь
закрываешь
 

AmdY

Пью пиво
Команда форума
а может достаточно file_get_contents file_put_contents
я в своё время намучался с fopen flock ..., на двух серваках из более чем ста возникала проблема с потерей данных, это по словам заказчика. так как доступа к сервакам мне никто не давал, проблема так и осталась нерешённой, зато с file_*_contents проблема отпала.
 

fixxxer

К.О.
Партнер клуба
ето не ок

PHP:
worker 1                    worker 2
data=get_contents
                         data=get_contents
data[counter]++           data[counter]++
put_contents(data)
                          put_contents(data)
 

AmdY

Пью пиво
Команда форума
угу, я был не прав, почему-то мне казалось что file_*_contents лочат файлы.
 

cDLEON

Онанист РНРСlub
может быть они и лочат.
Но между чтением и записью лок убирается.
 

dimagolov

Новичок
спрошу еще раз. зачем нужны файлы в такой задаче? почему не использовать базу или shared memory?
 

AmdY

Пью пиво
Команда форума
есть ещё другие варианты - sqllite, dba ...
 
Сверху