1.18.00 mise à jour jsondb depuis ZwiiCMS
Rotation des fichiers de journaux
This commit is contained in:
parent
1b91289320
commit
299f105c5d
@ -18,6 +18,10 @@ class JsonDb extends \Prowebcraft\Dot
|
|||||||
protected $db = '';
|
protected $db = '';
|
||||||
protected $data = null;
|
protected $data = null;
|
||||||
protected $config = [];
|
protected $config = [];
|
||||||
|
// Tentative d'écriture après échec
|
||||||
|
const MAX_FILE_WRITE_ATTEMPTS = 5;
|
||||||
|
// Délais entre deux tentaives
|
||||||
|
const RETRY_DELAY_SECONDS = 1;
|
||||||
|
|
||||||
public function __construct($config = [])
|
public function __construct($config = [])
|
||||||
{
|
{
|
||||||
@ -129,7 +133,7 @@ class JsonDb extends \Prowebcraft\Dot
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
$this->data = json_decode(file_get_contents($this->db), true);
|
$this->data = json_decode(file_get_contents($this->db), true);
|
||||||
if (!$this->data === null && json_last_error() !== JSON_ERROR_NONE) {
|
if (!$this->data === null) {
|
||||||
throw new \InvalidArgumentException('Le fichier ' . $this->db
|
throw new \InvalidArgumentException('Le fichier ' . $this->db
|
||||||
. ' contient des données invalides.');
|
. ' contient des données invalides.');
|
||||||
}
|
}
|
||||||
@ -143,6 +147,7 @@ class JsonDb extends \Prowebcraft\Dot
|
|||||||
public function save()
|
public function save()
|
||||||
{
|
{
|
||||||
// Encode les données au format JSON avec les options spécifiées
|
// Encode les données au format JSON avec les options spécifiées
|
||||||
|
//$encoded_data = json_encode($this->data, JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT | JSON_PRETTY_PRINT);
|
||||||
$encoded_data = json_encode($this->data, JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT);
|
$encoded_data = json_encode($this->data, JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT);
|
||||||
|
|
||||||
// Vérifie la longueur de la chaîne JSON encodée
|
// Vérifie la longueur de la chaîne JSON encodée
|
||||||
@ -156,24 +161,29 @@ 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
|
||||||
|
|
||||||
// $now = \DateTime::createFromFormat('U.u', microtime(true));
|
//$now = \DateTime::createFromFormat('U.u', microtime(true));
|
||||||
// file_put_contents("tmplog.txt", '[JsonDb][' . $now->format('H:i:s.u') . ']--' . $this->db . "\r\n", FILE_APPEND);
|
//file_put_contents("tmplog.txt", '[JsonDb][' . $now->format('H:i:s.u') . ']--' . $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
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Incrémente le compteur de tentatives
|
// Incrémente le compteur de tentatives
|
||||||
$attempt++;
|
$attempt++;
|
||||||
|
|
||||||
|
// Attente 1/4 de seconde
|
||||||
|
usleep(0.25);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Vérifie si l'écriture a échoué même après plusieurs tentatives
|
// Vérifie si l'écriture a échoué même après plusieurs tentatives
|
||||||
if ($write_result !== $encoded_length) {
|
if ($write_result !== $encoded_length) {
|
||||||
// Enregistre un message d'erreur dans le journal des erreurs
|
// Enregistre un message d'erreur dans le journal des erreurs
|
||||||
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.');
|
||||||
|
|
||||||
// Affiche un message d'erreur et termine le script
|
// Affiche un message d'erreur et termine le script
|
||||||
exit('Erreur d\'écriture, les données n\'ont pas été sauvegardées.');
|
exit('Erreur d\'écriture, les données n\'ont pas été sauvegardées.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -72,6 +72,9 @@ class common
|
|||||||
const COURSE_ENROLMENT_SELF_KEY = 2; // Ouvert à tous les membres disposant de la clé
|
const COURSE_ENROLMENT_SELF_KEY = 2; // Ouvert à tous les membres disposant de la clé
|
||||||
const COURSE_ENROLMENT_MANDATORY = 3;
|
const COURSE_ENROLMENT_MANDATORY = 3;
|
||||||
|
|
||||||
|
// Taille et rotation des journaux
|
||||||
|
const LOG_MAXSIZE = 4 * 1024 * 1024;
|
||||||
|
const LOG_MAXARCHIVE = 5;
|
||||||
|
|
||||||
public static $actions = [];
|
public static $actions = [];
|
||||||
public static $coreModuleIds = [
|
public static $coreModuleIds = [
|
||||||
@ -1514,18 +1517,67 @@ class common
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Journalisation
|
* Journalisation avec gestion de la taille maximale et compression
|
||||||
*/
|
*/
|
||||||
public function saveLog($message = '')
|
public function saveLog($message = '')
|
||||||
{
|
{
|
||||||
// Journalisation
|
// Chemin du fichier journal
|
||||||
$dataLog = helper::dateUTF8('%Y%m%d', time(), self::$i18nUI) . ';' . helper::dateUTF8('%H:%M', time(), self::$i18nUI) . ';';
|
$logFile = self::DATA_DIR . 'journal.log';
|
||||||
|
|
||||||
|
// Vérifier la taille du fichier
|
||||||
|
if (file_exists($logFile) && filesize($logFile) > self::LOG_MAXSIZE) {
|
||||||
|
$this->rotateLogFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Création de l'entrée de journal
|
||||||
|
$dataLog = helper::dateUTF8('%Y%m%d', time(), self::$i18nUI) . ';' .
|
||||||
|
helper::dateUTF8('%H:%M', time(), self::$i18nUI) . ';';
|
||||||
$dataLog .= helper::getIp($this->getData(['config', 'connect', 'anonymousIp'])) . ';';
|
$dataLog .= helper::getIp($this->getData(['config', 'connect', 'anonymousIp'])) . ';';
|
||||||
$dataLog .= empty($this->getUser('id')) ? 'visitor;' : $this->getUser('id') . ';';
|
$dataLog .= empty($this->getUser('id')) ? 'visitor;' : $this->getUser('id') . ';';
|
||||||
$dataLog .= $message ? $this->getUrl() . ';' . $message : $this->getUrl();
|
$dataLog .= $message ? $this->getUrl() . ';' . $message : $this->getUrl();
|
||||||
$dataLog .= PHP_EOL;
|
$dataLog .= PHP_EOL;
|
||||||
|
|
||||||
|
// Écriture dans le fichier si la journalisation est activée
|
||||||
if ($this->getData(['config', 'connect', 'log'])) {
|
if ($this->getData(['config', 'connect', 'log'])) {
|
||||||
file_put_contents(self::DATA_DIR . 'journal.log', $dataLog, FILE_APPEND);
|
file_put_contents($logFile, $dataLog, FILE_APPEND);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gère la rotation et la compression des fichiers journaux
|
||||||
|
*/
|
||||||
|
private function rotateLogFile()
|
||||||
|
{
|
||||||
|
$logFile = self::DATA_DIR . 'journal.log';
|
||||||
|
|
||||||
|
// Décaler tous les fichiers d'archive existants
|
||||||
|
for ($i = self::LOG_MAXARCHIVE - 1; $i > 0; $i--) {
|
||||||
|
$oldFile = self::DATA_DIR . 'journal-' . $i . '.log.gz';
|
||||||
|
$newFile = self::DATA_DIR . 'journal-' . ($i + 1) . '.log.gz';
|
||||||
|
|
||||||
|
if (file_exists($oldFile)) {
|
||||||
|
if ($i == self::LOG_MAXARCHIVE - 1) {
|
||||||
|
unlink($oldFile); // Supprimer le plus ancien
|
||||||
|
} else {
|
||||||
|
rename($oldFile, $newFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compresser le fichier journal actuel
|
||||||
|
if (file_exists($logFile)) {
|
||||||
|
$gz = gzopen(self::DATA_DIR . 'journal-1.log.gz', 'w9');
|
||||||
|
$handle = fopen($logFile, 'r');
|
||||||
|
|
||||||
|
while (!feof($handle)) {
|
||||||
|
gzwrite($gz, fread($handle, 8192));
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose($handle);
|
||||||
|
gzclose($gz);
|
||||||
|
|
||||||
|
// Créer un nouveau fichier journal vide
|
||||||
|
file_put_contents($logFile, '');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1535,7 +1587,7 @@ class common
|
|||||||
* Retourne les contenus d'un utilisateur
|
* Retourne les contenus d'un utilisateur
|
||||||
* @param string $userId identifiant
|
* @param string $userId identifiant
|
||||||
* @param string $serStatus teacher ou student ou admin
|
* @param string $serStatus teacher ou student ou admin
|
||||||
*
|
* @return array
|
||||||
* CETTE FONCTION EST UTILISEE PAR LAYOUT
|
* CETTE FONCTION EST UTILISEE PAR LAYOUT
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user