From 61fb5c8885aafebbadddbff37149846a1bcafa60 Mon Sep 17 00:00:00 2001 From: "CORSAIR\\remij" Date: Fri, 27 Sep 2024 18:51:05 +0200 Subject: [PATCH] =?UTF-8?q?Ajout=20mode=20batch=20pour=20sauvegarde=20dans?= =?UTF-8?q?=20bdd=20+=20impl=C3=A9mentation=20du=20mode=20batch=20=C3=A0?= =?UTF-8?q?=20l'=C3=A9diton=20des=20page=20et=20au=20log=20de=20la=20navig?= =?UTF-8?q?ation=20utilisateur=20+=20correction=20multi-sauvegardes=20du?= =?UTF-8?q?=20fichier=20html=20des=20pages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/class/jsondb/JsonDb.class.php | 3 ++ core/class/router.class.php | 3 ++ core/core.php | 44 ++++++++++++++++++++++++++---- core/module/page/page.php | 5 ++++ 4 files changed, 49 insertions(+), 6 deletions(-) diff --git a/core/class/jsondb/JsonDb.class.php b/core/class/jsondb/JsonDb.class.php index d96f8b99..cdbc4ead 100644 --- a/core/class/jsondb/JsonDb.class.php +++ b/core/class/jsondb/JsonDb.class.php @@ -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 $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 if ($write_result === $encoded_length) { // Sort de la boucle si l'écriture a réussi diff --git a/core/class/router.class.php b/core/class/router.class.php index 27d4dc55..75a22d89 100644 --- a/core/class/router.class.php +++ b/core/class/router.class.php @@ -517,9 +517,12 @@ class core extends common if ( $this->isConnected() === true && $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'), 'accessTimer', time()]); + $this->save(); } // Breadcrumb $title = $this->getData(['page', $this->getUrl(0), 'title']); diff --git a/core/core.php b/core/core.php index 31bd2308..f852d1f5 100644 --- a/core/core.php +++ b/core/core.php @@ -103,6 +103,8 @@ class common ]; */ private $data = []; + public $dbBatch = false; + private $dbPending = []; private $hierarchy = [ 'all' => [], 'visible' => [], @@ -548,11 +550,38 @@ class common $query .= '.' . $keys[$i]; } // 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; } + /** + * 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 * @param array $keys Clé(s) des données @@ -619,25 +648,28 @@ class common // Initialise le compteur de tentatives $attempts = 0; - // Convertit les données en chaîne de caractères - $serialized_data = serialize($data); - // Vérifie la longueur des données - $data_length = strlen($serialized_data); + $data_length = strlen($data); // Effectue jusqu'à 5 tentatives d'écriture while ($attempts < 5) { // Essaye d'écrire les données dans le fichier avec verrouillage exclusif $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 if ($write_result !== false && $write_result === $data_length) { // Sort de la boucle si l'écriture a réussi - return true; + break; } // Incrémente le compteur de tentatives $attempts++; + + // Délai + sleep(1); } // Échec de l'écriture après plusieurs tentatives diff --git a/core/module/page/page.php b/core/module/page/page.php index 2790fda1..308e612e 100644 --- a/core/module/page/page.php +++ b/core/module/page/page.php @@ -364,6 +364,8 @@ class page extends common ) { // 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') !== '') { + // Active l'enregistrement en batch + $this->dbBatch = true; // Génére l'ID si le titre de la page a changé if ($this->getInput('pageEditTitle') !== $this->getData(['page', $this->getUrl(2), 'title'])) { $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 if (!is_dir(self::DATA_DIR . self::$siteContent . '/content')) { mkdir(self::DATA_DIR . self::$siteContent . '/content', 0755);