PHP как перестать писать и усекать - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь реализовать некий атомарный метод 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. Кто-нибудь знает, как это сделать?

...