diff options
| author | 2013-12-28 17:29:38 +0100 | |
|---|---|---|
| committer | 2013-12-28 17:29:38 +0100 | |
| commit | 01a1dd09a8ee02250905a80d2662bfe811c09f09 (patch) | |
| tree | 9cfdd9c26f3f3b9b3d3ce44d36110c6ed41d0d9f /lib | |
| parent | 9ac1496d63da32524a33696187342ce061e9ef28 (diff) | |
Minz : refactorisation ModelArray et Log
Utilisation de fonctions natives de PHP comme file_put_contents et
var_export
Évite de garder un descripteur de fichier ouvert tout le temps
Et ModelTxt n'est plus utilisé
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Minz/Log.php | 33 | ||||
| -rw-r--r-- | lib/Minz/ModelArray.php | 139 | ||||
| -rw-r--r-- | lib/Minz/ModelTxt.php | 84 |
3 files changed, 68 insertions, 188 deletions
diff --git a/lib/Minz/Log.php b/lib/Minz/Log.php index a9b657271..848267065 100644 --- a/lib/Minz/Log.php +++ b/lib/Minz/Log.php @@ -1,5 +1,5 @@ <?php -/** +/** * MINZ - Copyright 2011 Marien Fressinaud * Sous licence AGPL3 <http://www.gnu.org/licenses/> */ @@ -19,7 +19,7 @@ class Minz_Log { const WARNING = 4; const NOTICE = 8; const DEBUG = 16; - + /** * Enregistre un message dans un fichier de log spécifique * Message non loggué si @@ -32,14 +32,14 @@ class Minz_Log { */ public static function record ($information, $level, $file_name = null) { $env = Minz_Configuration::environment (); - + if (! ($env === Minz_Configuration::SILENT || ($env === Minz_Configuration::PRODUCTION && ($level >= Minz_Log::NOTICE)))) { if (is_null ($file_name)) { $file_name = LOG_PATH . '/application.log'; } - + switch ($level) { case Minz_Log::ERROR : $level_label = 'error'; @@ -56,24 +56,13 @@ class Minz_Log { default : $level_label = 'unknown'; } - - if ($env == Minz_Configuration::PRODUCTION) { - $file = @fopen ($file_name, 'a'); - } else { - $file = fopen ($file_name, 'a'); - } - - if ($file !== false) { - $log = '[' . date('r') . ']'; - $log .= ' [' . $level_label . ']'; - $log .= ' --- ' . $information . "\n"; - fwrite ($file, $log); - fclose ($file); - } else { - throw new Minz_PermissionDeniedException ( - $file_name, - Minz_Exception::ERROR - ); + + $log = '[' . date('r') . ']' + . ' [' . $level_label . ']' + . ' --- ' . $information . "\n"; + + if (file_put_contents($file_name, $log, FILE_APPEND | LOCK_EX) === false) { + throw new Minz_PermissionDeniedException($file_name, Minz_Exception::ERROR); } } } diff --git a/lib/Minz/ModelArray.php b/lib/Minz/ModelArray.php index 4ba022143..bf2c4cb40 100644 --- a/lib/Minz/ModelArray.php +++ b/lib/Minz/ModelArray.php @@ -1,5 +1,5 @@ <?php -/** +/** * MINZ - Copyright 2011 Marien Fressinaud * Sous licence AGPL3 <http://www.gnu.org/licenses/> */ @@ -7,85 +7,58 @@ /** * La classe Model_array représente le modèle interragissant avec les fichiers de type texte gérant des tableaux php */ -class Minz_ModelArray extends Minz_ModelTxt { +class Minz_ModelArray { /** - * $array Le tableau php contenu dans le fichier $nameFile + * $array Le tableau php contenu dans le fichier $filename */ protected $array = array (); - + + /** + * $filename est le nom du fichier + */ + protected $filename; + /** - * Ouvre le fichier indiqué, charge le tableau dans $array et le $nameFile - * @param $nameFile le nom du fichier à ouvrir contenant un tableau + * Ouvre le fichier indiqué, charge le tableau dans $array et le $filename + * @param $filename le nom du fichier à ouvrir contenant un tableau * Remarque : $array sera obligatoirement un tableau */ - public function __construct ($nameFile) { - parent::__construct ($nameFile); - - if (!$this->getLock ('read')) { - throw new Minz_PermissionDeniedException ($this->filename); + public function __construct ($filename) { + $this->filename = $filename; + + if (!file_exists($this->filename)) { + throw new Minz_FileNotExistException($this->filename, Minz_Exception::WARNING); + } + elseif (($handle = $this->getLock()) === false) { + throw new Minz_PermissionDeniedException($this->filename); } else { - $this->array = include ($this->filename); - $this->releaseLock (); - - if (!is_array ($this->array)) { + $this->array = include($this->filename); + $this->releaseLock($handle); + + if ($this->array === false) { + throw new Minz_PermissionDeniedException($this->filename); + } elseif (is_array($this->array)) { + $this->array = $this->decodeArray($this->array); + } else { $this->array = array (); } - - $this->array = $this->decodeArray ($this->array); } - } - + } + /** - * Écrit un tableau dans le fichier $nameFile - * @param $array le tableau php à enregistrer + * Sauve le tableau $array dans le fichier $filename **/ - public function writeFile ($array) { - if (!$this->getLock ('write')) { - throw new Minz_PermissionDeniedException ($this->namefile); - } else { - $this->erase (); - - $this->writeLine ('<?php'); - $this->writeLine ('return ', false); - $this->writeArray ($array); - $this->writeLine (';'); - - $this->releaseLock (); - } - } - - private function writeArray ($array, $profondeur = 0) { - $tab = ''; - for ($i = 0; $i < $profondeur; $i++) { - $tab .= "\t"; - } - $this->writeLine ('array ('); - - foreach ($array as $key => $value) { - if (is_int ($key)) { - $this->writeLine ($tab . "\t" . $key . ' => ', false); - } else { - $this->writeLine ($tab . "\t" . '\'' . $key . '\'' . ' => ', false); - } - - if (is_array ($value)) { - $this->writeArray ($value, $profondeur + 1); - $this->writeLine (','); - } else { - if (is_numeric ($value)) { - $this->writeLine ($value . ','); - } else { - $this->writeLine ('\'' . addslashes ($value) . '\','); - } - } + protected function writeFile() { + if (!file_put_contents($this->filename, "<?php\n return " . var_export($this->array, true) . ';', LOCK_EX)) { + throw new Minz_PermissionDeniedException($this->filename); } - - $this->writeLine ($tab . ')', false); + return true; } - + + //TODO: check if still useful, and if yes, use a native function such as array_map private function decodeArray ($array) { $new_array = array (); - + foreach ($array as $key => $value) { if (is_array ($value)) { $new_array[$key] = $this->decodeArray ($value); @@ -93,30 +66,32 @@ class Minz_ModelArray extends Minz_ModelTxt { $new_array[$key] = stripslashes ($value); } } - + return $new_array; } - - private function getLock ($type) { - if ($type == 'write') { - $lock = LOCK_EX; - } else { - $lock = LOCK_SH; + + private function getLock() { + $handle = fopen($this->filename, 'r'); + if ($handle === false) { + return false; } - - $count = 1; - while (!flock ($this->file, $lock) && $count <= 50) { - $count++; + + $count = 50; + while (!flock($handle, LOCK_SH) && $count > 0) { + $count--; + usleep(1000); } - - if ($count >= 50) { - return false; + + if ($count > 0) { + return $handle; } else { - return true; + fclose($handle); + return false; } } - - private function releaseLock () { - flock ($this->file, LOCK_UN); + + private function releaseLock($handle) { + flock($handle, LOCK_UN); + fclose($handle); } } diff --git a/lib/Minz/ModelTxt.php b/lib/Minz/ModelTxt.php deleted file mode 100644 index 8c5973f4d..000000000 --- a/lib/Minz/ModelTxt.php +++ /dev/null @@ -1,84 +0,0 @@ -<?php -/** - * MINZ - Copyright 2011 Marien Fressinaud - * Sous licence AGPL3 <http://www.gnu.org/licenses/> -*/ - -/** - * La classe Model_txt représente le modèle interragissant avec les fichiers de type texte - */ -class Minz_ModelTxt { - /** - * $file représente le fichier à ouvrir - */ - protected $file; - - /** - * $filename est le nom du fichier - */ - protected $filename; - - /** - * Ouvre un fichier dans $file - * @param $nameFile nom du fichier à ouvrir - * @param $mode mode d'ouverture du fichier ('a+' par défaut) - * @exception FileNotExistException si le fichier n'existe pas - * > ou ne peux pas être ouvert - */ - public function __construct ($nameFile, $mode = 'a+') { - $this->filename = $nameFile; - if (!file_exists($this->filename)) { - throw new Minz_FileNotExistException ( - $this->filename, - Minz_Exception::WARNING - ); - } - - $this->file = @fopen ($this->filename, $mode); - - if (!$this->file) { - throw new Minz_PermissionDeniedException ( - $this->filename, - Minz_Exception::WARNING - ); - } - } - - /** - * Lit une ligne de $file - * @return une ligne du fichier - */ - public function readLine () { - return fgets ($this->file); - } - - /** - * Écrit une ligne dans $file - * @param $line la ligne à écrire - */ - public function writeLine ($line, $newLine = true) { - $char = ''; - if ($newLine) { - $char = "\n"; - } - - fwrite ($this->file, $line . $char); - } - - /** - * Efface le fichier $file - * @return true en cas de succès, false sinon - */ - public function erase () { - return ftruncate ($this->file, 0); - } - - /** - * Ferme $file - */ - public function __destruct () { - if (isset ($this->file)) { - fclose ($this->file); - } - } -} |
