блокировка файла

fixxxer

К.О.
Партнер клуба
Не-а. Там так

PHP:
if (flags.append) {
   mode[0] = a
} else if (flags.lock_ex) {
    if (stream_wrapper_in_file_name)
        error("Cannot lock and truncate streams")
    mode[0] = c
}
...
if (flags.lock_ex) {
    obtain_lock();
    ... 
}
...
Похоже, это связано с тем, что stream wrapper api несколько неконсистентен - нет способа проверить, поддерживается ли truncate одновременно с lock.
 

radioheaded

PHP нуб
В документации пишут

file_put_contents($file, $person, FILE_APPEND | LOCK_EX);

А в сорце написано:
if (flags & PHP_FILE_APPEND) {
mode[0] = 'a';
} else if (flags & LOCK_EX) {

Т.е. если указать оба флага, то использоваться будет только FILE_APPEND, если я правильно читаю.
Отчасти вы правы. Но там какая-то странная логика, я тоже не до конца понял. Если указать только LOCK_EX, то mode[0]='c' и файл будет обрезаться каждый раз (логично)
if (mode[0] == 'c') {
php_stream_truncate_set_size(stream, 0);
}
+ проверка на то, что работаем с файлом (блокируются только файлы, логично). Если указать только FILE_APPEND, то не будет выполнена проверка на блокировку (логично)
if (flags & LOCK_EX && (!php_stream_supports_lock(stream) || php_stream_lock(stream, LOCK_EX))) {
php_stream_close(stream);
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Exclusive locks are not supported for this stream");
RETURN_FALSE;
}
Но если указать оба флага, то не будет выполнена проверка на то, что работаем с обычным файлом (странно).
 

fixxxer

К.О.
Партнер клуба
Нормальная там логика. Исключается комбинация "not append + lock + stream" (тут небольшой хак). Дальше все ваще просто тупо в лоб.
 

gmc008

Новичок
А по теме что делать то? Возможно ли блокировать только для записи? Экспериментируя с flock такого не удалось сделать
 

gmc008

Новичок
PHP:
<?php
$fo = fopen('test.txt', 'r');
echo 'lock<br>';
flock($fo, LOCK_SH);
sleep(10);
flock($fo, LOCK_UN);
echo 'Unlock';
?>


PHP:
<?php
$fo = fopen('test.txt', 'r+');
flock($fo, LOCK_EX);
// пока предидущий скрипт не разблокирует то сюда не попадем
flock($fo, LOCK_UN);
?>
 

Фанат

oncle terrible
Команда форума
ну разумеется, мы не можем поставить эксклюзивный лок, пока стоит другой
я только не понял, зачем здесь эксклюзивный. ты же вроде читать только хотел?
 

radioheaded

PHP нуб
Подождите-подождите... Вы же хотели читать без блокирования. Тогда зачем блокируете?
 

gmc008

Новичок
Читать да, но если ее убрать то fopen будет ошибку возвращать
 
Сверху