flock () продолжает ждать снятия блокировки

0

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

<?php
$file = fopen("test.txt","w+");

if (flock($file,LOCK_EX))
  {
    fwrite($file,"Write something");
    sleep(10);
    flock($file,LOCK_UN);
  }
 else
  {
     echo "Error locking file!";
  }

 fclose($file);
?>

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

Теги:
locking

2 ответа

0
Лучший ответ

Похоже, вы не хотите, чтобы стая блокировалась? Вы просто хотите, чтобы первый процесс получил блокировку, а второй - потерпеть неудачу?

Чтобы сделать это, вы можете использовать LOCK_NB флаг, чтобы остановить flock вызов от блокировки:

$file = fopen("test.txt","r+");

if (flock($file,LOCK_EX | LOCK_NB))
  {
    fwrite($file,"Write something");
    sleep(10);
    flock($file,LOCK_UN);
  }
 else
  {
     echo "Error locking file!";
  }

 fclose($file);

Дополнительная информация доступна на странице документа flock php - http://php.net/manual/en/function.flock.php

  • 0
    Я хочу, чтобы первый процесс get заблокировал, а второй действительно не получился. Проблема в том, что когда я тестирую этот код, обе страницы браузера по-прежнему возвращают успех (если я добавлю эхо в оператор if).
  • 0
    Я тестировал в командной строке, и это работает для меня; Вы все еще sleep при тестировании в браузере? Вы на Windows, которая не поддерживает флаг LOCK_NB .
Показать ещё 12 комментариев
0

Вы можете использовать второй файл, например, "test.txt.updated", и поддерживать там состояние - то есть, был ли "test.txt" уже обновлен или нет. Что-то вроде следующего. ПРИМЕЧАНИЕ. Я открыл "text.txt" в append-mode, чтобы увидеть, действительно ли два параллельных прогона написаны только один раз в файле.

<?php

if (! ($f = fopen("text.txt", "a")) )
    print("Cannot write text.txt\n");
elseif (! flock($f, LOCK_EX))
    print("Error locking text.txt\n");
else {
    print("Locked text.txt\n");
    if (file_exists("text.txt.updated"))
        print("text.txt already updated\n");
    else {
        print("Updating text.txt and creating text.txt.updated\n");
        fwrite($f, "Write something\n");
        if ($stamp = fopen("text.txt.updated", "w"))
            fwrite($stamp, "whatever\n");
        else
            print("Oooooops, can't create the updated state file\n");
        sleep(10);
    }
    flock($f, LOCK_UN);
}

?>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню