13.2.00 flock sur le fichier principal (PB sous win)

This commit is contained in:
Fred Tempez 2024-04-06 09:10:49 +02:00
parent 03d1dacb88
commit 6687c324e5
2 changed files with 65 additions and 66 deletions

View File

@ -166,23 +166,23 @@ class JsonDb extends \Prowebcraft\Dot
error_log('Impossible d\'encoder les données en format JSON.');
return false;
}
$lockFile = $this->db . '.lock';
$lockHandle = fopen($lockFile, 'w');
$lockHandle = fopen($this->db, 'r+');
if (flock($lockHandle, LOCK_EX)) {
$attempts = 0;
$bytesWritten = false;
while ($attempts < self::MAX_FILE_WRITE_ATTEMPTS && $bytesWritten === false) {
$bytesWritten = file_put_contents($this->db, $jsonData);
ftruncate($lockHandle, 0); // Vide le fichier
rewind($lockHandle); // Remet le pointeur au début du fichier
$bytesWritten = fwrite($lockHandle, $jsonData);
if ($bytesWritten === false) {
$attempts++;
error_log('Erreur d\'écriture (tentative ' . $attempts . ') : impossible de sauvegarder les données.');
sleep(self::RETRY_DELAY_SECONDS); // Attendre avant de réessayer
}
}
flock($lockHandle, LOCK_UN);
fclose($lockHandle);
flock($lockHandle, LOCK_UN); // Libérer le verrouillage
fclose($lockHandle); // Fermer le fichier
if ($bytesWritten === false || $bytesWritten != strlen($jsonData)) {
error_log('Erreur d\'écriture, les données n\'ont pas été sauvegardées.');
@ -190,14 +190,11 @@ class JsonDb extends \Prowebcraft\Dot
}
} else {
error_log('Impossible d\'obtenir un verrouillage sur le fichier de base de données.');
fclose($lockHandle);
fclose($lockHandle); // Fermer le fichier
return false;
}
// Supprimer le fichier de verrouillage
if (file_exists($lockFile)) {
unlink($lockFile);
}
return true;
}
}
}

View File

@ -648,19 +648,20 @@ class common
// Écriture sécurisée dans le fichier avec un verrouillage
$attempts = 0;
while ($attempts < self::MAX_FILE_WRITE_ATTEMPTS) {
$lockHandle = fopen($filename . '.lock', 'w');
if (flock($lockHandle, LOCK_EX)) {
$bytesWritten = file_put_contents($filename, $jsonData, $options);
flock($lockHandle, LOCK_UN);
fclose($lockHandle);
$lockHandle = fopen($filename, 'c+');
if ($lockHandle !== false && flock($lockHandle, LOCK_EX)) {
$bytesWritten = fwrite($lockHandle, $jsonData);
if ($bytesWritten !== false && $bytesWritten === strlen($jsonData)) {
return true; // Écriture réussie
fflush($lockHandle); // Vider le tampon
ftruncate($lockHandle, ftell($lockHandle)); // Tronquer le fichier à la position actuelle du pointeur
flock($lockHandle, LOCK_UN); // Libérer le verrouillage
fclose($lockHandle); // Fermer le fichier
return file_put_contents($filename, $jsonData, $options) !== false; // Écriture réussie
}
} else {
fclose($lockHandle);
if (file_exists($lockHandle)) {
unlink($lockHandle);
flock($lockHandle, LOCK_UN); // Libérer le verrouillage en cas d'échec d'écriture
}
if ($lockHandle !== false) {
fclose($lockHandle); // Fermer le fichier en cas d'échec d'acquisition du verrouillage
}
$attempts++;
error_log('Erreur d\'écriture (tentative ' . $attempts . ') : impossible de sauvegarder les données dans ' . $filename);
@ -671,6 +672,7 @@ class common
return false;
}
/**
* Effacer les données de la page
* @param string pageId