flock ($fp,LOCK_EX) мешает, а flock ($fp,LOCK_SH) - нет

Ysn

Guest
flock ($fp,LOCK_EX) мешает, а flock ($fp,LOCK_SH) - нет

По идее, это верно. Но верно для ОСТАЛЬНЫХ скриптов (или моментов скрипта). Но в данном случае получается, что я открываю файл, лочу его при помощи flock ($fp,LOCK_EX), так как не хочу, чтобы при подсчете строк, вычислений, и так далее - мне мешали... И он не принтуется. То есть, ни обратиться к нему... ничего. Если бы из остальных скриптов - я бы понял... Но я же ОТСЮДА, изнутри лока пытаюсь с файлом работать....

Так в чем же дело?
 

Djibo

Guest
что ты с файлом делать то хочешь? читать из него или записывать?
не хочу, чтобы при подсчете строк, вычислений, и так далее - мне мешали...
кто и как тебе мешает?
 

Djibo

Guest
да дело даж не в этом, если он читать будет я вот не понимаю зачем ставить LOCK_EX.
 

Ysn

Guest
Автор оригинала: BRat
да да...режим открытия какой? a+,a,w....?
Да всякий. В данном конкретном случае - r... но та же беда происходит и с другими режимами.

Что касается того, кто будет мешать - у меня есть админ и юзер. Вот они друг другу и будут мешать.

Самое интересное, что я только что обнаружил - одна и та же конструкция с лоченьем у админа работает, а у юзера - нет... Может быть это из-за того, что у юзера лоченье происходит в файле, который инклудится? То есть, ситуация какая? У админа есть форма с action на этот же файл. Он в ней submit нажимает, и попадает в один из isset'ов... В котором, если он попал в него, инклудится файл, где и происходит fopen, flock, и так далее. И это работает. А у юзера другая штука: его файл основной имеет форму, с action на файл, в котором есть форма, с action на этот файл (который инклудится в основной)...ив нем же есть isset с fopen, flock, и т.д. И Вот это-то и не работает... До тех пор, пока не заремирую flock, или не переставлю его в LOCK_SH...


Надеюсь, понятно объяснил....

-~{}~ 23.12.04 08:02:

А с файлом я хочу - и читать, и считать, и записывать.
 

BRat

o_0
для r-ки всегда ставь SH потому как EX для записывающих всегда ставится, поэтому ты можешь быть 100% уверен что в файл этот никто ничего не пишет, пока ты читаешь... SH просто позволит всем остальным читателям не ждать твоего процесса а паралельно работать..
 

Ysn

Guest
Могу объяснить... я не только читаю... Я и получаю кое-какие значения оттуда... И по ним считаю. Если же в этот момент админ эти значения изменит... будет ой-ой-ой...
Да и обратные ситуации бывают. Например, мне надо подсчитать количество строк... подсчитал, после чего работаю с этим файлом... а если я подсчитал количество строк, и кто-то в этот момент добавил/удалил одну? А скрипт будет работать, основываясь на ложном количестве строк...

-~{}~ 23.12.04 08:15:

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

Именно поэтому, мне нужно, чтобы никто не мог прочитать файл в тот момент, когда его читает его владелец.
 

BRat

o_0
разделяемая блокировка не позволяет что то писать в файл, который читают. Сначала писатель подождет когда закончит читатель. Так что тебе все равно смысла нет ставить исключительную.
 

BRat

o_0
то есть совершенно без разницы как лочить..все равно в юзер запишет в файл только после того как админ его прочитает..это в любом случае..
 

Djibo

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

Именно поэтому, мне нужно, чтобы никто не мог прочитать файл в тот момент, когда его читает его владелец.
вообще бред какой то
 

Ysn

Guest
Автор оригинала: BRat
то есть совершенно без разницы как лочить..все равно в юзер запишет в файл только после того как админ его прочитает..это в любом случае..
Угу... Админ прочитал. Узнал сколько строчек, например. Юзер записал (добавил строчку, или стер). Юзер закончил работу. Теперь Админ начал работу, основываясь на устаревших данных, сколько строчек в файле...

Так?
 

Djibo

Guest
Блочь файл пока твой "админ" не закончит таки считать то что захотел.
И вообще заблочил файл -> сделал что хотел -> расблочил.
А то сначала строки посчитаю, потом считывать начну ...
 

BRat

o_0
Автор оригинала: Ysn
Угу... Админ прочитал. Узнал сколько строчек, например. Юзер записал (добавил строчку, или стер). Юзер закончил работу. Теперь Админ начал работу, основываясь на устаревших данных, сколько строчек в файле...

Так?
Так будет и при исключительной, не только при SH. Почему ты решил что если ты поставишь искл лок то все будет работать нормально?
 

Ysn

Guest
Минутку... так я могу так, чтоли?! :

$fp=fopen ("a.txt", "r");
flock ($fp,LOCK_EX); // тут открыть
fclose($fp);
...
$fp=fopen ("a.txt", "w");
....
fclose($fp);
...
$fp=fopen ("a.txt", "w+");
flock ($fp,LOCK_UN); // и только тут закрыть?
fclose($fp);

Разве так можно?

-~{}~ 23.12.04 08:39:

Автор оригинала: BRat
Так будет и при исключительной, не только при SH. Почему ты решил что если ты поставишь искл лок то все будет работать нормально?
Потому что прочитал, что если файл залочен исключительно, то остальным - шиш... ни прочесть, ни написать.
 

BRat

o_0
Автор оригинала: Ysn
Минутку... так я могу так, чтоли?! :

$fp=fopen ("a.txt", "r");
flock ($fp,LOCK_EX); // тут открыть
fclose($fp);
...
$fp=fopen ("a.txt", "w");
....
fclose($fp);
...
$fp=fopen ("a.txt", "w+");
flock ($fp,LOCK_UN); // и только тут закрыть?
fclose($fp);

Разве так можно?

-~{}~ 23.12.04 08:39:


Потому что прочитал, что если файл залочен исключительно, то остальным - шиш... ни прочесть, ни написать.
1. Так нельзя конечно)
2.Ну как разлочишь его так и юзер в него и запишет, и все равно ты будешь с устаревшими данными работать
 

Ysn

Guest
открываю файл на чтение.
считываю в массив.
закрываю.

делаю расчеты.

открываю файл на запись.
записываю.
закрываю.

делаю расчеты.

открываю файл на дозапись.
дозаписываю.
закрываю.
 
Сверху