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
|
// 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
|
||||||
|
@ -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']);
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user