Ajout mode batch pour sauvegarde dans bdd + implémentation du mode batch à l'éditon des page et au log de la navigation utilisateur + correction multi-sauvegardes du fichier html des pages

This commit is contained in:
CORSAIR\remij 2024-09-27 18:51:05 +02:00
parent e0748c2eb6
commit 61fb5c8885
4 changed files with 49 additions and 6 deletions

View File

@ -163,6 +163,9 @@ class JsonDb extends \Prowebcraft\Dot
// Essaye d'écrire les données encodées dans le fichier de base de données // Essaye d'écrire les données encodées dans le fichier de base de données
$write_result = file_put_contents($this->db, $encoded_data, LOCK_EX); // Les utilisateurs multiples obtiennent un verrou $write_result = file_put_contents($this->db, $encoded_data, LOCK_EX); // Les utilisateurs multiples obtiennent un verrou
// Logs perf
// file_put_contents('site/tmp/file_put_contents_logs.txt', "[JsonDb] $this->db\r\n", FILE_APPEND);
// Vérifie si l'écriture a réussi // Vérifie si l'écriture a réussi
if ($write_result === $encoded_length) { if ($write_result === $encoded_length) {
// Sort de la boucle si l'écriture a réussi // Sort de la boucle si l'écriture a réussi

View File

@ -517,9 +517,12 @@ class core extends common
if ( if (
$this->isConnected() === true $this->isConnected() === true
&& $this->getUser('id') && $this->getUser('id')
&& !$this->isPost() // Pour la perf ignore les méthodes POST
) { ) {
$this->dbBatch = true;
$this->setData(['user', $this->getUser('id'), 'accessUrl', $this->getUrl()]); $this->setData(['user', $this->getUser('id'), 'accessUrl', $this->getUrl()]);
$this->setData(['user', $this->getUser('id'), 'accessTimer', time()]); $this->setData(['user', $this->getUser('id'), 'accessTimer', time()]);
$this->save();
} }
// Breadcrumb // Breadcrumb
$title = $this->getData(['page', $this->getUrl(0), 'title']); $title = $this->getData(['page', $this->getUrl(0), 'title']);

View File

@ -103,6 +103,8 @@ class common
]; ];
*/ */
private $data = []; private $data = [];
public $dbBatch = false;
private $dbPending = [];
private $hierarchy = [ private $hierarchy = [
'all' => [], 'all' => [],
'visible' => [], 'visible' => [],
@ -548,11 +550,38 @@ class common
$query .= '.' . $keys[$i]; $query .= '.' . $keys[$i];
} }
// Appliquer la modification, le dernier élément étant la donnée à sauvegarder // Appliquer la modification, le dernier élément étant la donnée à sauvegarder
$success = is_object($db->set($query, $keys[count($keys) - 1], true)); $success = is_object($db->set($query, $keys[count($keys) - 1], !$this->dbBatch));
} }
// Si mode batch activé, enregistre que la db doit être enregistrée
if($success && $this->dbBatch && !(in_array($db, $this->dbPending))) {
$this->dbPending[] = $db;
}
return $success; return $success;
} }
/**
* Sauvegarde toutes les données lorsque le mode batch est activé
* @return bool
*/
public function save()
{
// Ne rien faire si mode batch à off
if(!$this->dbBatch) {
return;
}
// Sauvegarde les db stockées
foreach($this->dbPending as $index => $db) {
$db->save();
unset($this->dbPending[$index]);
}
// Stop le mode batch
$this->dbBatch = false;
}
/** /**
* Accède aux données * Accède aux données
* @param array $keys Clé(s) des données * @param array $keys Clé(s) des données
@ -619,25 +648,28 @@ class common
// Initialise le compteur de tentatives // Initialise le compteur de tentatives
$attempts = 0; $attempts = 0;
// Convertit les données en chaîne de caractères
$serialized_data = serialize($data);
// Vérifie la longueur des données // Vérifie la longueur des données
$data_length = strlen($serialized_data); $data_length = strlen($data);
// Effectue jusqu'à 5 tentatives d'écriture // Effectue jusqu'à 5 tentatives d'écriture
while ($attempts < 5) { while ($attempts < 5) {
// Essaye d'écrire les données dans le fichier avec verrouillage exclusif // Essaye d'écrire les données dans le fichier avec verrouillage exclusif
$write_result = file_put_contents($filename, $data, LOCK_EX | $flags); $write_result = file_put_contents($filename, $data, LOCK_EX | $flags);
// Logs perf
// file_put_contents(self::TEMP_DIR . 'file_put_contents_logs.txt', "[core] $filename\r\n", FILE_APPEND);
// Vérifie si l'écriture a réussi // Vérifie si l'écriture a réussi
if ($write_result !== false && $write_result === $data_length) { if ($write_result !== false && $write_result === $data_length) {
// Sort de la boucle si l'écriture a réussi // Sort de la boucle si l'écriture a réussi
return true; break;
} }
// Incrémente le compteur de tentatives // Incrémente le compteur de tentatives
$attempts++; $attempts++;
// Délai
sleep(1);
} }
// Échec de l'écriture après plusieurs tentatives // Échec de l'écriture après plusieurs tentatives

View File

@ -364,6 +364,8 @@ class page extends common
) { ) {
// Si le Title n'est pas vide, premier test pour positionner la notification du champ obligatoire // Si le Title n'est pas vide, premier test pour positionner la notification du champ obligatoire
if ($this->getInput('pageEditTitle', helper::FILTER_ID, true) !== null && $this->getInput('pageEditTitle') !== '') { if ($this->getInput('pageEditTitle', helper::FILTER_ID, true) !== null && $this->getInput('pageEditTitle') !== '') {
// Active l'enregistrement en batch
$this->dbBatch = true;
// Génére l'ID si le titre de la page a changé // Génére l'ID si le titre de la page a changé
if ($this->getInput('pageEditTitle') !== $this->getData(['page', $this->getUrl(2), 'title'])) { if ($this->getInput('pageEditTitle') !== $this->getData(['page', $this->getUrl(2), 'title'])) {
$pageId = $this->getInput('pageEditTitle', helper::FILTER_ID, true); $pageId = $this->getInput('pageEditTitle', helper::FILTER_ID, true);
@ -550,6 +552,9 @@ class page extends common
] ]
]); ]);
// Sauvegarde toutes les données et stop le mode batch
$this->save();
// Creation du contenu de la page // Creation du contenu de la page
if (!is_dir(self::DATA_DIR . self::$siteContent . '/content')) { if (!is_dir(self::DATA_DIR . self::$siteContent . '/content')) {
mkdir(self::DATA_DIR . self::$siteContent . '/content', 0755); mkdir(self::DATA_DIR . self::$siteContent . '/content', 0755);