Rev 1198 | Blame | Last modification | View Log | RSS feed
<?php
// declare(encoding='UTF-8');
/**
* Réalise la maintenance des images.
* Action :
* - suppression_images_orphelines : supprime les images qui ne sont plus dans la bdd.
* Utilisation : /opt/lampp/bin/php cli.php ImagesMaintenance suppression_images_orphelines
*
* @category php 5.2
* @package Cel/Scripts
* @author Aurelien PERONNET <aurelien@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @copyright Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org)
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
* @version $Id$
*/
class ImagesMaintenance {
private $bdd = null;
private $script = null;
private $chemin_base_images = '';
private $nbFichiersSupprimes = 0;
private $espaceLibere = 0;
public function __construct(Conteneur $conteneur) {
$this->chemin_base_images = $conteneur->getParametre('cel.chemin_images');
$this->bdd = $conteneur->getBdd();
$this->script = $conteneur->getScript();
}
public function executer($arguments) {
if (isset($arguments[0]) == false) {
throw new Exception("Veuillez indiquer l'action à réaliser en paramètre.", E_USER_ERROR);
}
$action = $arguments[0];
switch ($action) {
case 'suppression_images_orphelines' :
$this->supprimerFichiersImagesOrphelins();
break;
}
}
private function supprimerFichiersImagesOrphelins() {
$profondeur = 1;
$this->itererRecursivement($this->chemin_base_images, $profondeur);
print "Suppression des images orphelines effectuées\n";
$fichiersSupprimes = $this->nbFichiersSupprimes;
print "Fichiers orphelins détectés et supprimés : $fichiersSupprimes\n";
$espaceLibere = $this->convertirOctets($this->espaceLibere);
print "Espace disque économisé : $espaceLibere \n";
}
private function itererRecursivement($dossier, $profondeur) {
$dossiersAIgnorer = array('export');
$iterateur = new DirectoryIterator($dossier);
foreach ($iterateur as $element) {
if ($element->isDot() || in_array($element->getBasename(), $dossiersAIgnorer)) {
continue;
}
$indentation = str_repeat("\t", ($profondeur - 1));
if ($element->isDir()) {
$profondeur_dossier_fils = $profondeur + 1;
print "$indentation Analyse dossier : {$element->getPathname()}\n";
$this->itererRecursivement($element->getPathname(), $profondeur_dossier_fils);
} else {
print "$indentation Vérif fichier : {$element->getBasename()}\n";
$existe = $this->verifierPresenceImageDansBdd($element);
if ($existe == false) {
$this->supprimerFichierImage($element);
}
}
}
}
private function verifierPresenceImageDansBdd($element) {
$existe = true;
$nom_fichier = $element->getFilename();
if (preg_match('/^([0-9]{3})_([0-9]{3})_([0-9]{3})_[^.]+[.](jpg|xml)$/', $nom_fichier, $match)) {
$id_image = $match[1].$match[2].$match[3];
$id_image = ltrim($id_image, '0');
$requete = 'SELECT COUNT(ci_id_image) AS image_existe '.
'FROM cel_images '.
"WHERE ci_id_image = $id_image ";
$imageExiste = $this->bdd->requeter($requete, Bdd::SQL_RETOUR_COLONNE);
if ($imageExiste < 1) {
print "Image $id_image introuvable dans la base de données\n";
$existe = false;
}
}
return $existe;
}
private function supprimerFichierImage($element) {
$fichier = $element->getPathname();
$fichierNom = $element->getBasename();
if (file_exists($fichier)) {
$this->espaceLibere += $element->getSize();
if (unlink($fichier) === false) {
throw new Exception("Problème lors de la suppression du fichier : $fichier \n", E_USER_ERROR);
} else {
$this->nbFichiersSupprimes++;
print "Suppression du fichier : $fichierNom\n";
}
} else {
throw new Exception("Problème le fichier n'existe pas : $fichier\n", E_USER_ERROR);
}
}
private function convertirOctets($taille) {
$units = array('B', 'KB', 'MB', 'GB', 'TB');
for ($i = 0; $taille >= 1024 && $i < 4; $i++) $taille /= 1024;
return round($taille, 2).' '.$units[$i];
}
}
?>