forked from ZwiiCMS-Team/ZwiiCMS
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:
parent
e0748c2eb6
commit
61fb5c8885
@ -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
|
||||
|
@ -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']);
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user