Я пытаюсь реализовать некий атомарный метод get и set в php. Вот что я получил до сих пор.
function atomic_get_and_set($filename, $oldData, $newData)
{
$size = filesize($filename) + 100000;
$fp = fopen($filename, "c+");
$failure = "0";
if (flock($fp, LOCK_EX)) {
$current_content = fread($fp, $size);
if($current_content == $oldData) {
rewind($fp);
fwrite($fp, $newData);
} else {
$failure = "1".$current_content;
}
flock($fp, LOCK_UN);
}
fclose($fp);
return $failure;
}
Я пытаюсь вернуть содержимое файла, которому предшествует «1», если то, что мы читаем, не является ожидаемым старым, «0», и записать вв противном случае файл.
Мне пришлось открыть файл с помощью C + или +, чтобы убедиться, что я не удаляю содержимое файла при открытии. Однако следующий сценарий не выполняется:
file_put_contents("test.txt", "hello world");
atomic_get_and_set("test.txt", "hello world", "hallo");
Действительно, результатом файла является «мир приветствия», а не просто «привет», потому что я не нашел, как сказать ему, чтобы он закончил писать файлпосле fwrite
. Кто-нибудь знает, как это сделать?