У меня есть функция, которая получает имя файла и объект json для записи в текстовый файл.
Объект обновляется и должен полностью заменить текущее содержимое файла. У каждого посетителя сайта есть свой файл. Множественные быстрые изменения создают ситуацию, когда файл усекается на fopen(file,w+)
, а затем не записывается, поскольку он заблокирован. Конечный результат - пустой файл.
Я уверен, что есть стандартный простой способ сделать это, поскольку это такая обычная деятельность. В идеале я ищу способ проверить, есть ли у файла блокировка, прежде чем обрезать файл с помощью fopen
в режиме w+
или способ переключения режимов.
Кажется странным, что вам пришлось бы обрезать файл с помощью fopen()
, чтобы получить дескриптор файла для передачи в flock()
, чтобы проверить, заблокирован ли он - но вы только что усекли его, так в чем смысл?
Вот функция, которая у меня есть до сих пор:
function updateFile($filename, $jsonFileData) {
$fp = fopen($filename,"w+");
if (flock($fp, LOCK_EX)) {
fwrite($fp, $jsonFileData);
flock($fp, LOCK_UN);
fclose($fp);
return true;
} else {
fclose($fp);
return false;
}
}