Я выполняю тот же фрагмент кода на машине 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()
в первую очередь – вы не забыли проверить статус блокировки перед любой записью, но помните, что другие программы могут не делать этого «.