толи баг, толи руки =/ рнр 4,3,0 fopen, flock

wanderer

PHP - rulez!...
толи баг, толи руки =/ рнр 4,3,0 fopen, flock

не знаю куда эту тему запостить, решил сюда.
вобщем вопрос:
у меня w2k sp3
php 4.3.0
PHP:
$fp = fopen("d.data", "w");
flock($fp, 1);
fwrite($fp, "data");
flock($fp, 3);
fclose($fp);
файл создаётся, но ничего не записывается!
почему?
хотя на линуксе и на win98 всё записалось
в мануале искал, что-то ничего не нашёл. может плохо искал, тогда пзл ткните где смотреть.
 

Barlone

Guest
Может, второй параметр flock писать, как в мане предлагается, LOCK_SH / LOCK_EX / LOCK_UN ?
 

wanderer

PHP - rulez!...
да, забыл добавить:
если открывать файл с параметром "а", то если файл пустой - данные не добавляются, а если в файле уже есть что-то, то всё нормально записывается =/
 

wanderer

PHP - rulez!...
и ещё одно замечание! если файл блокировать не на 1 (LOCK_SH), а на 2 (LOCK_EX) то всё нормально!
to Barlone: имхо, не имеет значения так как это просто константы со значением 1/2/3 для "красивости" или простоты
 

Barlone

Guest
Автор оригинала: wanderer
и ещё одно замечание! если файл блокировать не на 1 (LOCK_SH), а на 2 (LOCK_EX) то всё нормально!
Ты же сам себе ответил. (Под виндой flock использует winapi-функцию LockFileEx, а в Win32 Programer's Reference про нее сказано "Locking a portion of a file for shared access denies all processes write access to the specified region of the file, including the process that first locks the region", то есть поставил shared lock - никто (и ты тоже) писать в файл не может) Испльзуй LOCK_EX.
 

wanderer

PHP - rulez!...
не понял. всегда использовал 1 - работало
в вин88 флок просто игнорировался а на Линуксе работало =/
 

Barlone

Guest
А в чем смысл использовать LOCK_SH при записи?
 

wanderer

PHP - rulez!...
в том, чтоб разрешить читать файл =)
если я КОНЕЧНО правильно понял описание в мане.
 

Barlone

Guest
Блокировка файлов нужна для сохранения целостности данных. При чтении ты должен ставить LOCK_SH а при записи LOCK_EX если тебе конечно не наплевать на то, что ты можешь прочитать не то что записал. А использовать LOCK_SH при записи - это все равно что не использовать блокировку совсем.
 
Сверху