LOCK_NB игнорируется - PullRequest
       5

LOCK_NB игнорируется

7 голосов
/ 02 апреля 2011

запустив этот код дважды:

$fp = @fopen('test.test', "wb");

    if (flock($fp, LOCK_NB | LOCK_EX)){
                @fwrite($fp, $data);
                echo 'written';
                sleep(5);
    }else{
        echo 'skipped , ok';
    }

    @flock($fp, LOCK_UN);
    @fclose($fp);

всегда дает мне вывод "написано"

Означает, что LOCK_NB пропущен, любые подсказки (как для winbdow, так и для unix)

РЕДАКТИРОВАТЬ (2012-03-29 все еще не исправлено): https://bugs.php.net/bug.php?id=54453&edit=3 Ошибка PHP # 54453

Ответы [ 2 ]

18 голосов
/ 22 марта 2012

При использовании Apache + PHP меня обманывали, полагая, что LOCK_NB был проигнорирован (это не так, это был браузер, ожидающий завершения первого запроса).

Поскольку я делал два запроса с одним и тем же браузером, браузер ждал завершения первого вызова, прежде чем делать следующий (даже игнорируя заголовок «Connection: close»).

Использование 2 отдельных браузеров (в моем случае Chrome + Firefox или Chrome + wget на сервере) Я пришел к выводу, что LOCK_NB работал просто отлично.

Если файл в режиме w + был заблокирован с помощью LOCK_EX | LOCK_NB, попытка другого LOCK_EX | LOCK_NB для того же файла вернул false (предполагаемое поведение).

0 голосов
/ 04 апреля 2011

LOCK_NB работает только когда:

  1. Файл заблокирован с LOCK_SH, и вы делаете LOCK_EX|LOCK_NB
  2. Файл заблокирован с LOCK_EX, и вы делаете LOCK_SH|LOCK_NB

LOCK_NB игнорируется, если:

  1. Файл заблокирован с помощью LOCK_EX, и вы делаете LOCK_EX|LOCK_NB
  2. Файл заблокирован с LOCK_SH, и вы делаете LOCK_SH|LOCK_NB

Полагаю, это ошибка? или им нужно сделать LOCK_NB2? я сообщил об этом как об ошибке в PHP.NET.

РЕДАКТИРОВАТЬ (2012-03-22 еще не исправлено): https://bugs.php.net/bug.php?id=54453&edit=3 Ошибка PHP # 54453

...