У меня есть php-Script, который сохраняет некоторые данные в XML файле. Но если два пользователя сохраняют некоторые данные в одно и то же время, XML становится сломанным и все данные теряются.
Вот мой код:
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->load($szFile);
... Действия...
$dom->formatOutput = true;
$dom->save($szFile);
Есть ли способ сохранить XML файл без этой проблемы?
Может быть, я должен переименовать файл, чтобы убедиться, что никто не может его решить?
Открыто:
function openXML($szFile){
$szPath = '../path/';
$szDummyFile = 'dummy.xml';
$i = 0;
$bRepeat = true;
$bContinue = false;
while($i < 20 && $bRepeat){ // Timeout: 10 s
if(file_exists($szPath . $szFile)){
rename($szPath . $szFile, $szPath . $szDummyFile);
$bRepeat = false;
$bContinue = true;
}else{
usleep(500000); // 0,5 s
}
$i++;
}
if($bContinue){
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->load($szPath . $szDummyFile);
return $dom;
}else{
return false;
}
}
Сохранить:
function saveXML($dom, $szFile){
$szPath = '../path/';
$szDummyFile = 'dummy.xml';
$dom->formatOutput = true;
$dom->save($szPath . $szDummyFile);
rename($szPath . $szDummyFile, $szPath . $szFile);
}
If-Match
, сервер может определить, был ли файл уже изменен, и вернуть код ошибки 412, предотвращая перезапись файла.