Взаимоисключающие флаги на file_put_contents? - PullRequest
3 голосов
/ 22 августа 2009

В документации file_put_contents () говорится следующее:

FILE_APPEND

Взаимоисключающие с LOCK_EX с дополнения являются атомными и, таким образом, есть нет причин для блокировки.

LOCK_EX

Взаимоисключающие с FILE_APPEND.

Тем не менее, пара строк ниже, я вижу следующий код:

<?php
$file = 'people.txt';
// The new person to add to the file
$person = "John Smith\n";
// Write the contents to the file, 
// using the FILE_APPEND flag to append the content to the end of the file
// and the LOCK_EX flag to prevent anyone else writing to the file at the same time
file_put_contents($file, $person, FILE_APPEND | LOCK_EX);
?>

Итак, флаги FILE_APPEND и LOCK_EX являются взаимоисключающими или нет? Если да, почему они используют это в примере? Это плохая документация?

Спасибо за ваш вклад!

Ответы [ 2 ]

4 голосов
/ 07 сентября 2009

Как и @ karim79 сказал , это было ошибкой в ​​руководстве: см. ошибка # 49329 , о которой я сообщил после просмотра этого вопроса / ответа и был исправлен / закрыт пару минут назад.

(Потребуется некоторое время, чтобы отразиться в онлайн-версии руководства, но в его источниках исправлено)

3 голосов
/ 22 августа 2009

Это просто плохая документация. В руководстве четко указано :

FILE_APPEND: если имя файла уже существует, добавьте данные к файл вместо того, чтобы перезаписать его. Взаимоисключающий с LOCK_EX с дополнения являются атомными и, таким образом, есть нет причин для блокировки.

LOCK_EX: приобрести эксклюзивный замок в файле при переходе к пишу. Взаимоисключающий с FILE_APPEND.

И пример, о котором вы говорите:

<?php
$file = 'people.txt';
// The new person to add to the file
$person = "John Smith\n";
// Write the contents to the file, 
// using the FILE_APPEND flag to append the content to the end of the file
// and the LOCK_EX flag to prevent anyone else writing to the file at the same time
file_put_contents($file, $person, FILE_APPEND | LOCK_EX);
?>

Похоже, что человек, который закодировал пример, неправильно понял значение «взаимоисключающего», или , которое производит какое-то тайное недокументированное поведение.

...