Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Ajout de la classe Cache \o/

  • Loading branch information...
commit f07be43f9e65b7b47dd6a615d00c662f8a9f92c2 1 parent adbb3ff
Marien Fressinaud authored
View
4 README
@@ -1,11 +1,11 @@
========
TODO v1
*) Améliorer fonctionnement Exceptions : DONE
- *) Création système de cache
+ *) Création système de cache : DONE
*) Amélioration classe Error : OK (voir pour la v2)
*) Revoir système de Logs : OK (voir pour la v2)
- *) Correction bugs
*) Documentation
+ *) Correction bugs
========
View
1  app/configuration/application.ini
@@ -8,6 +8,7 @@ title = "MINZ Is Not Zend"
layout = true
language = "fr"
max_history_urls = 10
+cache_enabled = false
; [db]
; host = "localhost"
View
1  lib/Bootstrap.class.php
@@ -104,6 +104,7 @@ private function __construct($params) {
require('Helper.class.php');
require('Translate.class.php');
require('Paginator.class.php');
+ require('Cache.class.php');
require('View.class.php');
// inclusion du Bootstrap utilisateur
View
106 lib/Cache.class.php
@@ -0,0 +1,106 @@
+<?php
+/**
+ * MINZ - Copyright 2011 Marien Fressinaud
+ * Sous licence AGPL3 <http://www.gnu.org/licenses/>
+*/
+
+/**
+ * La classe Cache permet de gérer facilement les pages en cache
+ */
+class Cache {
+ /**
+ * $expire timestamp auquel expire le cache de $url
+ */
+ private $expire = 0;
+
+ /**
+ * $file est le nom du fichier de cache
+ */
+ private $file = '';
+
+ /**
+ * $enabled permet de déterminer si le cache est activé
+ */
+ private static $enabled = true;
+
+ /**
+ * Constructeur - initialise $
+ */
+ public function __construct() {
+ $this->_fileName();
+ $this->_expire();
+ }
+
+ public function _fileName() {
+ $file = md5($_SERVER['REQUEST_URI']);
+
+ $this->file = CACHE_PATH.'/'.$file;
+ }
+
+ public function _expire() {
+ if($this->exist()) {
+ $this->expire = filemtime($this->file)+Configuration::delayCache();
+ }
+ }
+
+ /**
+ * Permet de savoir si le cache est activé
+ * @return true si activé, false sinon
+ */
+ public static function isEnabled() {
+ return Configuration::cacheEnabled() && self::$enabled;
+ }
+
+ /**
+ * Inverse l'activation du cache
+ */
+ public static function switchCache() {
+ self::$enabled = !self::$enabled;
+ }
+
+ /**
+ * Détermine si le cache de $url a expiré ou non
+ * @return true si il a expiré, false sinon
+ */
+ public function expired() {
+ return time() > $this->expire;
+ }
+
+ /**
+ * Affiche le contenu du cache
+ * @print le code html du cache
+ */
+ public function render() {
+ if($this->exist()) {
+ include($this->file);
+ }
+ }
+
+ /**
+ * Enregistre $html en cache
+ * @param $html le html à mettre en cache
+ */
+ public function cache($html) {
+ file_put_contents($this->file, $html);
+ }
+
+ /**
+ * Permet de savoir si le cache existence
+ * @return true si il existe, false sinon
+ */
+ public function exist() {
+ return file_exists($this->file);
+ }
+
+ public static function clean() {
+ $files = opendir(CACHE_PATH);
+
+ while($fic = readdir($files)) {
+ if ($fic != '.' && $fic != '..') {
+ unlink(CACHE_PATH.'/'.$fic);
+ }
+ }
+
+ closedir(CACHE_PATH);
+ }
+}
View
146 lib/Configuration.class.php
@@ -9,23 +9,23 @@
* C'est un singleton
*/
class Configuration {
- /**
- * $instance représente l'instance de Configuration
- */
+ /**
+ * $instance représente l'instance de Configuration
+ */
private static $instance = null;
- /**
- * VERSION est la version actuelle de MINZ
- */
+ /**
+ * VERSION est la version actuelle de MINZ
+ */
const VERSION = '0.5.0';
/**
- * valeurs possibles pour l'"environment"
- * SILENT rend l'application muette (pas de log)
- * PRODUCTION est recommandée pour une appli en production
- * (log les erreurs critiques)
- * DEVELOPMENT log toutes les erreurs
- */
+ * valeurs possibles pour l'"environment"
+ * SILENT rend l'application muette (pas de log)
+ * PRODUCTION est recommandée pour une appli en production
+ * (log les erreurs critiques)
+ * DEVELOPMENT log toutes les erreurs
+ */
const SILENT = 0;
const PRODUCTION = 1;
const DEVELOPMENT = 2;
@@ -38,10 +38,10 @@ class Configuration {
* $title le nom de l'application
* $layout indique si on utilise un layout (false par défaut)
* $db paramètres pour la base de données (tableau)
- * - host le serveur de la base
- * - user nom d'utilisateur
- * - password mot de passe de l'utilisateur
- * - base le nom de la base de données
+ * - host le serveur de la base
+ * - user nom d'utilisateur
+ * - password mot de passe de l'utilisateur
+ * - base le nom de la base de données
*/
private static $environment = Configuration::PRODUCTION;
private static $use_url_rewriting = false;
@@ -50,6 +50,8 @@ class Configuration {
private static $layout = false;
private static $language = 'en';
private static $maxHistoryUrls = 5;
+ private static $cacheEnabled = true;
+ private static $delayCache = 3600;
private static $db = array(
'host' => false,
@@ -59,32 +61,32 @@ class Configuration {
);
- /**
- * Permet de récupérer l'instance de Configuration
- * @param $params tableau des paramètres utiles :
- * configFile = chemin vers le fichier de conf
- * (peut être à null si déjà instancié)
- * @return l'instance de Configuration
- */
+ /**
+ * Permet de récupérer l'instance de Configuration
+ * @param $params tableau des paramètres utiles :
+ * configFile = chemin vers le fichier de conf
+ * (peut être à null si déjà instancié)
+ * @return l'instance de Configuration
+ */
public static function getInstance($configFile) {
if(is_null(self::$instance)) {
- try {
- self::$instance = new Configuration($configFile);
- } catch(ConfigurationException $e) {
- throw $e;
- }
+ try {
+ self::$instance = new Configuration($configFile);
+ } catch(ConfigurationException $e) {
+ throw $e;
+ }
}
return self::$instance;
}
- /**
- * Initialise les variables de configuration
- * Attention : private car singleton
- * @param $params tableau des paramètres utiles :
- * configFile = chemin vers le fichier de conf
- */
- private function __construct($configFile) {
+ /**
+ * Initialise les variables de configuration
+ * Attention : private car singleton
+ * @param $params tableau des paramètres utiles :
+ * configFile = chemin vers le fichier de conf
+ */
+ private function __construct($configFile) {
if(file_exists($configFile)) {
if(!$this->parseIniFile($configFile)
@@ -105,52 +107,52 @@ public static function use_layout() { return self::$layout; }
public static function use_url_rewriting() { return self::$use_url_rewriting; }
public static function data_base() { return self::$db; }
public static function language() {
- $l = self::$language;
-
- $l_session = Session::param('language');
- if($l_session) {
- $l = $l_session;
- }
-
- return $l;
- }
- public static function maxHistoryUrls() {
- return self::$maxHistoryUrls;
- }
+ $l = self::$language;
+
+ $l_session = Session::param('language');
+ if($l_session) {
+ $l = $l_session;
+ }
+
+ return $l;
+ }
+ public static function maxHistoryUrls() { return self::$maxHistoryUrls; }
+ public static function cacheEnabled() { return self::$cacheEnabled; }
+ public static function delayCache() { return self::$delayCache; }
// SETTEURS
private function _environment($env) {
- switch($env) {
- case 'silent': self::$environment = Configuration::SILENT; break;
- case 'production': self::$environment = Configuration::PRODUCTION; break;
- case 'development': self::$environment = Configuration::DEVELOPMENT; break;
- default: self::$environment = Configuration::PRODUCTION;
- }
+ switch($env) {
+ case 'silent': self::$environment = Configuration::SILENT; break;
+ case 'production': self::$environment = Configuration::PRODUCTION; break;
+ case 'development': self::$environment = Configuration::DEVELOPMENT; break;
+ default: self::$environment = Configuration::PRODUCTION;
+ }
}
private function _maxHistoryUrls($max) {
- if($max<2) {
- $max = 2;
- }
- self::$maxHistoryUrls = $max;
+ if($max<2) {
+ $max = 2;
+ }
+ self::$maxHistoryUrls = $max;
}
- /**
- * Parse un fichier de config de type "constantes"
- * @param $configFile chemin du fichier de config
- * @return true si tout s'est bien passé, false sinon
- */
+ /**
+ * Parse un fichier de config de type "constantes"
+ * @param $configFile chemin du fichier de config
+ * @return true si tout s'est bien passé, false sinon
+ */
private function parseConstantesFile($configFile) {
require_once($configFile);
// ENVIRONMENT et USE_URL_REWRITING sont des variables indispensables
if(defined('ENVIRONMENT')) {
- $this->_environment(ENVIRONMENT);
+ $this->_environment(ENVIRONMENT);
} else {
return false;
}
if(defined('USE_URL_REWRITING')) {
- self::$use_url_rewriting = USE_URL_REWRITING;
+ self::$use_url_rewriting = USE_URL_REWRITING;
} else {
return false;
}
@@ -160,6 +162,8 @@ private function parseConstantesFile($configFile) {
if(defined('LAYOUT')) self::$layout = LAYOUT;
if(defined('LANGUAGE')) self::$language = LANGUAGE;
if(defined('MAX_HISTORY_URLS')) $this->_maxHistoryUrls(MAX_HISTORY_URLS);
+ if(defined('CACHE_ENABLED')) self::$cacheEnabled = CACHE_ENABLED;
+ if(defined('DELAY_CACHE')) self::$delayCache = DELAY_CACHE;
if(defined('DB_HOST')) self::$db['host'] = DB_HOST;
if(defined('DB_USER')) self::$db['user'] = DB_USER;
@@ -170,10 +174,10 @@ private function parseConstantesFile($configFile) {
}
/**
- * Parse un fichier de config de type ".ini"
- * @param $configFile chemin du fichier de config
- * @return true si tout s'est bien passé, false sinon
- */
+ * Parse un fichier de config de type ".ini"
+ * @param $configFile chemin du fichier de config
+ * @return true si tout s'est bien passé, false sinon
+ */
private function parseIniFile($configFile) {
$ini_array = @parse_ini_file($configFile, true);
@@ -192,13 +196,13 @@ private function parseIniFile($configFile) {
// environment et use_url_rewriting sont des variables indispensables
if(isset($general['environment'])) {
- $this->_environment($general['environment']);
+ $this->_environment($general['environment']);
} else {
return false;
}
if(isset($general['use_url_rewriting'])) {
- self::$use_url_rewriting = $general['use_url_rewriting'];
+ self::$use_url_rewriting = $general['use_url_rewriting'];
} else {
return false;
}
@@ -208,6 +212,8 @@ private function parseIniFile($configFile) {
if(isset($general['layout'])) self::$layout = $general['layout'];
if(isset($general['language'])) self::$language = $general['language'];
if(isset($general['max_history_urls'])) $this->_maxHistoryUrls($general['max_history_urls']);
+ if(isset($general['cache_enabled'])) self::$cacheEnabled = $general['cache_enabled'];
+ if(isset($general['delay_cache'])) self::$delayCache = $general['delay_cache'];
if($db) {
// il est nécessaire d'avoir défini ces variables pour la BD
View
14 lib/Controller.class.php
@@ -63,18 +63,28 @@ private function __construct($controller, $action) {
* Permet d'exécuter le contrôleur
*/
public function handle() {
- // l'action existe dans le contrôleur (héritage)
- if(is_callable(array($this, self::$action.'Action'))) {
+ $cache = new Cache();
+ if(Cache::isEnabled() && !$cache->expired()) {
+ $cache->render();
+ } elseif(is_callable(array($this, self::$action.'Action'))) {
$this->firstAction();
call_user_func(array($this, self::$action.'Action'));
$this->lastAction();
// Affiche la vue (avec layout ou pas selon ce qui est demandé)
+ ob_start();
if($this->view->has_layout()) {
$this->view->renderWithLayout();
} else {
$this->view->render();
}
+ $html = ob_get_clean();
+
+ if(Cache::isEnabled() && $cache->expired()) {
+ $cache->cache($html);
+ }
+
+ echo $html;
} else {
throw new ActionException('Action cannot be called : '.self::$action.'Action', MinzException::ERROR);
}
View
1  lib/Route.class.php
@@ -50,6 +50,7 @@ public static function getInstance() {
if( is_null(self::$instance) ) {
self::$instance = new Route();
}
+
return self::$instance;
}
View
2  lib/View.class.php
@@ -116,7 +116,7 @@ public function has_layout() {
* Inverse l'utilisation du layout (si on l'utilisait, on ne l'utilise plus et inversement)
*/
public function switchLayout() {
- $this->layout = !$this->layout;
+ $this->layout = !$this->layout;
}
View
1  public/index.php
@@ -23,6 +23,7 @@
define('LIB_PATH', realpath(PUBLIC_PATH.'/../lib'));
define('APP_PATH', realpath(PUBLIC_PATH.'/../app'));
define('LOG_PATH', realpath(PUBLIC_PATH.'/../log'));
+define('CACHE_PATH', realpath(PUBLIC_PATH.'/../cache'));
// Ajout du répertoire /lib dans l'include_path
set_include_path(get_include_path() . PATH_SEPARATOR . LIB_PATH);
Please sign in to comment.
Something went wrong with that request. Please try again.