Intereting Posts

Поведение PHP flock () в Windows против Linux

Я выполняю тот же фрагмент кода на машине Windows и машине Linux. Оба работают с PHP 5.4:

$file = "lock.txt"; $fp = fopen($file, "w+"); flock($fp, LOCK_EX); var_dump(@file_put_contents($file, 'hello' . rand())); flock($fp, LOCK_UN); fclose($fp); 

На компьютере Windows операция file_put_contents() завершается с ошибкой и возвращает значение false. На машине Linux это удается.

Я пытаюсь выяснить, какое из этих двух действий действительно правильно, и как я могу стандартизировать поведение в обеих системах (для записи моя цель состоит в том, чтобы file_put_contents() неудачу. Мне не нужно, чтобы он был надежным или атомный, я просто хочу, чтобы он потерпел неудачу.)

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

Похоже, документация для flock() действительно отвечает на этот вопрос, хотя и не настолько, насколько это возможно. В документации указывается

flock () использует обязательную блокировку вместо консультативной блокировки в Windows

который достаточно ясен, но я был отброшен первым комментарием, который читает

Flock использует только блокировку ADVISORY; то есть другие процессы могут полностью игнорировать блокировку

Я интерпретировал это как означающее, что мой собственный процесс будет уважать блокировку неявно; на самом деле это означает что-то вроде: «Мы предполагаем, что – как только вы используете flock() в первую очередь – вы не забыли проверить статус блокировки перед любой записью, но помните, что другие программы могут не делать этого «.