En vous promenant sur Beamreactor, nous stockons votre IP 48h pour des raisons de sécurité.

Markdown-Reader

cleanup Dokumentation › CLEANUP_DOCUMENTATION

CLEANUP_DOCUMENTATION

Cleanup #

Nettoyage des caches et fichiers temporaires de BeamReactor.

Version: 1.2.0

Niveau requis: `CLEANUP_LEVEL_ADMIN`

Depuis: 2002

Vue d'ensemble #

Plugin de maintenance système qui supprime récursivement les fichiers de cache et temporaires pour forcer le rechargement complet de l'application. Nettoie `var/save/` et `var/tmp/` tout en préservant les fichiers critiques.

Fonctionnalités #

  • Suppression récursive des caches (`var/save/`)
  • Nettoyage des fichiers temporaires (`var/tmp/`)
  • Suppression automatique des dossiers vides
  • Protection des fichiers système (`.htaccess`, `hist.txt`)
  • Rapport détaillé avec compteurs de fichiers/dossiers supprimés
  • Flush output pour affichage en temps réel

Cas d'usage #

Quand utiliser cleanup :

  • En cas de comportement cache incohérent
  • Pour forcer la régénération de toutes les ressources
  • Avant déploiement de modifications critiques
  • Debugging de problèmes de persistence

Effet :

Réinitialisation complète du système de cache → rechargement total au prochain accès.

Architecture des répertoires #

var/
├── tmp/		  ← Nettoyé (fichiers temporaires)
├── save/		 ← Nettoyé (caches générés)
└── hist.txt	  ← PROTÉGÉ (historique global)

Configuration #

| Variable | Valeur | Description |

|----------|--------|-------------|

| `$cfg[20]` | `'var'` | Répertoire racine des données volatiles |

Fonctions #

dirmtime #

Calcule la date de dernière modification d'un répertoire (récursif).

function dirmtime(string $dir): int

Retourne : Timestamp Unix de la modification la plus récente.

Comportement :

  • Parcours récursif de l'arborescence
  • Compare `filemtime()` de tous les fichiers
  • Retourne le plus grand timestamp trouvé

Usage : Détection de modifications profondes dans un arbre de fichiers.

---

removeEmptySubFolders #

Supprime récursivement les dossiers vides.

function removeEmptySubFolders(string $path): bool

Paramètres :

Retourne : `true` si le dossier est vide après nettoyage.

Effets de bord :

  • Incrémente `$total_deleted_folders` (variable globale)
  • Affiche les dossiers protégés rencontrés

Protection :

Vérifie `$protected_folders` avant suppression. Ne touche jamais aux dossiers racine `var/save/` et `var/tmp/`.

Algorithme :

1. Scan récursif de l'arbre

2. Si dossier vide ET non protégé → `rmdir()`

3. Remonte l'arbre en supprimant les parents devenus vides

---

listFilesAndFolders #

Scan récursif retournant fichiers et dossiers séparés.

function listFilesAndFolders(string|array $path): array

Paramètres :

  • `$path` — Chemin ou tableau de chemins (supporte wildcards `*`)

Retourne :

[
  [$folders],  // Tableau des répertoires trouvés
  [$files]	 // Tableau des fichiers trouvés
]

Filtrage :

  • Ignore dossiers dans `$protected_folders`
  • Ignore fichiers dans `$protected_files`

Usage typique :

$content = listFilesAndFolders('var/tmp/');
echo count($content[0]) . ' dossiers, ' . count($content[1]) . ' fichiers';

---

flushSys #

Force l'output buffering pour affichage temps réel.

function flushSys(): bool

Retourne : `true`

Actions :

  • Envoie 1024 espaces (contournement buffer Apache)
  • Désactive gzip (`apache_setenv('no-gzip', 1)`)
  • Configure PHP : `output_buffering=0`, `zlib.output_compression=0`, `implicit_flush=1`

Contexte :

Permet de voir la progression du nettoyage en direct sans attendre la fin du script.

---

killcache #

Suppression récursive des fichiers dans un répertoire.

function killcache(string $dirname): int

Paramètres :

Retourne :

| Code | Signification |

|------|---------------|

| `1` | Nettoyage réussi |

| `-1` | Répertoire inexistant |

Effets de bord :

  • Incrémente `$total_deleted_files` pour chaque suppression réussie
  • Affiche liste `<ol>` des fichiers supprimés

Protection :

  • Ignore `.htaccess`
  • Ignore fichiers dans `$protected_files`
  • Appels récursifs pour sous-dossiers

Affichage :

<ol>
  <li>var/save/cache_page_42.html</li>
  <li>var/save/render_block_123.json</li>
</ol>

Flux d'exécution #

1. Initialisation #

$var_path = getcwd() . DIRECTORY_SEPARATOR . $cfg[20];
$tmp_path = $var_path . DIRECTORY_SEPARATOR . 'tmp';
$save_path = $var_path . DIRECTORY_SEPARATOR . 'save';
$hist_file = $var_path . DIRECTORY_SEPARATOR . 'hist.txt';

$protected_folders = [$save_path, $tmp_path];
$protected_files = [$hist_file];

2. Nettoyage `var/save/` #

if(is_dir($save_path))
{
	$content_save = listFilesAndFolders($save_path);
	$i = killcache($save_path);

	if($i == 1) echo $dialcache[0]; // "Cache save nettoyé"
	else if($i == 0) echo $dialcache[7]; // "Répertoire vide"
	else echo $dialcache[1]; // "Erreur"

	removeEmptySubFolders($save_path);
}

3. Nettoyage `var/tmp/` #

if(is_dir($tmp_path))
{
	$content_tmp = listFilesAndFolders($tmp_path);

	// Suppression fichiers
	if(count($content_tmp[1]) > 0)
	{
		$total_deleted_files = 0;
		killcache($tmp_path);
		echo $dialcache[3] . '(' . $total_deleted_files . '/' . count($content_tmp[1]) . ')';
	}

	// Suppression dossiers vides
	if(count($content_tmp[0]) > 0)
	{
		$total_deleted_folders = 0;
		removeEmptySubFolders($tmp_path);
		echo $total_deleted_folders . '/' . count($content_tmp[0]);
	}
}

4. Finalisation #

echo $dialcache[5]; // "Opération terminée"
flushSys();

Variables globales #

| Variable | Type | Usage |

|----------|------|-------|

| `$total_deleted_files` | int | Compteur fichiers supprimés |

| `$total_deleted_folders` | int | Compteur dossiers supprimés |

| `$dialcache` | array | Messages localisés |

Locale #

Fichier : `getlocale('cleanup')`

Variable : `$dialcache[]`

| Index | Description |

|-------|-------------|

| 0 | Cache save nettoyé |

| 1 | Erreur répertoire save inexistant |

| 3 | Cache tmp nettoyé (format sprintf avec compteurs) |

| 4 | Erreur répertoire tmp inexistant |

| 5 | Message fin d'opération |

| 6 | Suppression dossiers vides en cours |

| 8 | Erreur suppression fichier (préfixe) |

| 9 | Nettoyage partiel tmp (certains fichiers échoués) |

Sécurité #

Contrôle d'accès #

if(!secure('CLEANUP_LEVEL_ADMIN'))
{
	forbids();
	return;
}

Seuls les administrateurs (`CLEANUP_LEVEL_ADMIN`) peuvent exécuter ce plugin.

Fichiers protégés #

Toujours préservés :

  • `.htaccess` — Configuration Apache
  • `var/hist.txt` — Historique global du site

Dossiers protégés contre rmdir :

  • `var/save/` — Racine cache (contenu supprimé, dossier préservé)
  • `var/tmp/` — Racine temporaire (contenu supprimé, dossier préservé)

Risques #

Aucun risque de perte de données utilisateur :

  • Les uploads sont dans `$cfg[6]` (non touché)
  • La base de données n'est pas affectée
  • Seuls les fichiers régénérables sont supprimés

Impact fonctionnel :

  • Ralentissement temporaire (recalcul des caches)
  • Sessions utilisateur potentiellement perdues si stockées en fichiers dans `var/tmp/`

Exemple de sortie #

Cache save nettoyé
Suppression des dossiers vides en cours...
<ol>
  <li>var/save/renders/page_home.html</li>
  <li>var/save/renders/page_about.html</li>
  <li>var/save/compiled/template_main.php</li>
</ol>

Cache tmp nettoyé (47/47)
Suppression des dossiers vides en cours...
12/15

Opération terminée

Performance #

Complexité : O(n) où n = nombre total de fichiers + dossiers

Temps typique : 2-5 secondes pour 10 000 fichiers

Optimisations :

  • `glob()` natif (C bindings)
  • Pas de lecture du contenu des fichiers
  • Flush progressif pour feedback utilisateur

Différences avec d'autres plugins #

| Plugin | Objectif | Portée |

|--------|----------|--------|

| `cleanup.php` | RAZ cache système | `var/save/`, `var/tmp/` |

| `save.php` | Backup complet site | Tout sauf `var/` |

| `checklinks.php` | Vérification liens | Lecture seule |

Notes de migration #

Depuis version 1.1.0 :

  • Chemins en dur (`save/`, `tmp/`) → `$cfg[20]/save/`, `$cfg[20]/tmp/`
  • Ajout protection `hist.txt`
  • `$protected_files` introduit

Rétrocompatibilité :

Si `$cfg[20]` non défini, le plugin échouera proprement avec messages d'erreur.

Limitations connues #

  • Pas de dry-run
  • Pas de sélection granulaire (tout ou rien)
  • Pas de journalisation des suppressions (sauf affichage HTML)
  • Sessions PHP en fichiers perdues si dans `var/tmp/`

Dépendances #

  • `frameheader()` / `framefooter()` — Système de frame BeamReactor
  • `secure()` — Vérification des permissions
  • `forbids()` — Gestion refus d'accès
  • `getlocale()` — Internationalisation
  • `$cfg[20]` — Configuration chemin `var/`
de en fr