1.7.09 flock sur le fichier principal (PB sous win)

This commit is contained in:
Fred Tempez 2024-04-05 18:21:09 +02:00
parent a35036e0fa
commit 6c0f34ae71
2 changed files with 66 additions and 63 deletions

View File

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

View File

@ -824,16 +824,20 @@ class common
// Écriture sécurisée dans le fichier avec un verrouillage // Écriture sécurisée dans le fichier avec un verrouillage
$attempts = 0; $attempts = 0;
while ($attempts < self::MAX_FILE_WRITE_ATTEMPTS) { while ($attempts < self::MAX_FILE_WRITE_ATTEMPTS) {
$lockHandle = fopen($filename . '.lock', 'w'); $lockHandle = fopen($filename, 'c+');
if (flock($lockHandle, LOCK_EX)) { if ($lockHandle !== false && flock($lockHandle, LOCK_EX)) {
$bytesWritten = file_put_contents($filename, $jsonData, $options); $bytesWritten = fwrite($lockHandle, $jsonData);
flock($lockHandle, LOCK_UN);
fclose($lockHandle);
if ($bytesWritten !== false && $bytesWritten === strlen($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 { flock($lockHandle, LOCK_UN); // Libérer le verrouillage en cas d'échec d'écriture
fclose($lockHandle); }
if ($lockHandle !== false) {
fclose($lockHandle); // Fermer le fichier en cas d'échec d'acquisition du verrouillage
} }
$attempts++; $attempts++;
error_log('Erreur d\'écriture (tentative ' . $attempts . ') : impossible de sauvegarder les données dans ' . $filename); error_log('Erreur d\'écriture (tentative ' . $attempts . ') : impossible de sauvegarder les données dans ' . $filename);
@ -846,6 +850,7 @@ class common
/** /**
* Génère un fichier json avec la liste des pages * Génère un fichier json avec la liste des pages
* *