IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Demande d'info sur mise en cache par contrôleur en PHP


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juillet 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2015
    Messages : 59
    Points : 32
    Points
    32
    Par défaut Demande d'info sur mise en cache par contrôleur en PHP
    Bonjour à tous,

    je suis à la recherche d'un tutoriel pour mettre les pages de mon site - développé en POO - en cache.
    Cette mise en cache doit se faire par le biais du contrôleur de ces pages.

    Quelqu'un saurait-il ou je pourrais trouver des exemples de scripts ...? Cela fait quelques jours que je cherche ...

    Par avance merci pour votre aide.

  2. #2
    Membre éprouvé Avatar de tdutrion
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2009
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 561
    Points : 1 105
    Points
    1 105
    Par défaut
    Bonjour,

    Ta demande n'est pas claire... quelles sont les contraintes ? Qui te contraint ? (pourquoi faudrait-il mettre les pages en cache dans le controlleur ?

    Utilises-tu un framework ? As-tu la possibilité de mettre en place un cache Varnish par exemple ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Juillet 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2015
    Messages : 59
    Points : 32
    Points
    32
    Par défaut
    Bonjour Théocrite et merci pour ton intérêt sur ma question. Mes excuses pour cette réponse tardive j'ai eu une fin de semaine chargée.

    voici pour éclaircir ma demande :

    je développe un blog en PHP orienté objet - POO - sur un modèle MVC. Je n'utilise pas de FrameWork et ne pourrais utiliser cache varnish pour ce développement.

    Mon arborescence figure :
    - un dossier web
    - un dossier library
    - un dossier Application qui contient mon Backend et mon Frontend.

    pour accéder à mes pages de vues - index.php, inserComment.php, ... - (dans le Backend et dans le Frontend), je dois passer par une page contrôleur qui génère ma vue.

    Ma contrainte : je dois mettre en cache mes pages de vue (index.php, ...) et ne pas repasser par ma page contrôleur si ma vue a été mise en cache.

    Jusqu'à maintenant mon site fonctionne mais j'ai un message d'erreur sur mes pages quand elles sont lues la première fois et que le fichier cache n'existe pas ... :

    Warning: filemtime(): stat failed for C:\wamp\www\Git\Cours\05_Programmer_en_oriente_objet\17_Description_Application\07_Exercice\03_Exos\App\Frontend\Modules\News\Views../../../../../../Web/tmp/cache/views/FrontEnd_View_Index in C:\wamp\www\Git\Cours\05_Programmer_en_oriente_objet\17_Description_Application\07_Exercice\03_Exos\lib\OCFram\Cache.php on line 25
    J'ai pu neutraliser le message en ajoutant à mes scripts "error_reporting(0);" mais la méthode ne me semble pas tout à fait orthodoxe ...

    Voici mes codes pour information :


    Ma classe Cache :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    <?php
    class Cache{
     
    	public $dirname;	// Dossier de cache
    	public $duration;   // Durée de vie du cache EN MINUTES
    	public $buffer;		// Buffer (utilisé pour les méthodes start/end)
     
    	/**
    	* Initialise le cache
    	* @param string $dirname Dossier contenant le cache
    	* @param int $duration Durée de vie du cache
    	**/
    	public function __construct($dirname, $duration){
    		$this->dirname = $dirname;
    		$this->duration = $duration;
    	}
     
    	/**
    	* Ecrit une chaine de caractère dans le cache
    	* @param string $cachename Nom du fichier de cache
    	* @param string $content Chaine de caractère à stocker
    	**/
    	public function write($cachename, $content)
    	{
    		$file = filemtime($this->dirname.'/'.$cachename);
    		$lifetime = (time() - ($file)) / 60;
    		return file_put_contents($this->dirname.'/'.$cachename, serialize([$lifetime, $content]));
    	}
     
    	/**
    	* Permet de lire une variable dans le cache
    	* @param string $cachename Nom du fichier de cache
    	**/
    	public function read($cachename){
    		$file = $this->dirname.'/'.$cachename;
    		if(!file_exists($file)){
    			return false;
    		}
    		$lifetime = (time() - filemtime($file)) / 60;
    		if($lifetime > $this->duration){
    			return false;
    		}
    		return file_get_contents($file);
    	}
     
    	/**
    	* Permet de supprimer un fichier de cache
    	* @param string $cachename Nom du fichier de cache
    	**/
    	public function delete($cachename){
    		$file = $this->dirname.'/'.$cachename;
    		if(file_exists($file)){
    			unlink($file);
    		}
    	}
     
    	/**
    	* Permet de nettoyer le cache, Vider tous les fichiers en cache
    	**/
    	public function clear(){
    		$files = glob($this->dirname.'/*');
    		foreach( $files as $file ) {
    			unlink($file);
    		}
    	}
     
    	/**
    	* Inclue un fichier en utilisant le cache
    	* @param string $file Fichier à inclure (chemin absolu)
    	* @param string $cachename Nom du fichier de cache
    	**/
    	public function inc($file, $cachename = null){
    		if(!$cachename){
    			$cachename = basename($file);
    		}
    		if($content = $this->read($cachename)){
    			echo $content;
    			return true;
    		}
    		ob_start();
    		require $file;
    		$content = ob_get_clean();
    		$this->write($cachename, $content);
    		echo $content;
    		return true;
    	}
     
    	/**
    	* Démarre un buffer qui permettra de mettre en cache tout le contenu jusqu'au prochain Cache::end()
    	* @param string $cachename Nom du fichier de cache
    	**/
    	public function start($cachename){
    		if($content = $this->read($cachename)){
    			echo $content;
    			$this->buffer = false;
    			return true;
    		}
    		ob_start();
    		$this->buffer = $cachename;
    	}
     
     
    	public function end(){
    		if(!$this->buffer){
    			return false;
    		}
    		$content = ob_get_clean();
    		echo $content;
    		$this->write($this->buffer, $content);
    	}
     
    }
    Ma page d'index :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php require '../lib/OCFram/Cache.php'; ?>
    <?php define('CACHE_DIR', dirname(__FILE__));?>
    <?php $Cache = new Cache(CACHE_DIR.'../../../../../../Web/tmp/cache/views',0.5); ?>
     
    <?php
        if(!$Cache->start('FrontEnd_View_Index'))
    	{
          sleep(1);
    	  error_reporting(0);
    	foreach ($listeNews as $news)
    {
    ?>
      <h2><a href="news-<?= $news['id'] ?>.html"><?= $news['titre'] ?></a></h2>
      <p><?= nl2br($news['contenu']) ?></p>
    <?php
    }
        $Cache->end();
     
    }
    ?>
    Mon contrôleur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    <?php
    namespace App\Frontend\Modules\News;
     
    use \OCFram\BackController;
    use \OCFram\HTTPRequest;
    use \Entity\Comment;
    use \FormBuilder\CommentFormBuilder;
    use \OCFram\FormHandler;
    use \OCFram\Cache;
     
    class NewsController extends BackController
    {
      public function executeIndex(HTTPRequest $request)
      {
        $nombreNews = $this->app->config()->get('nombre_news');
        $nombreCaracteres = $this->app->config()->get('nombre_caracteres');
     
        // On ajoute une définition pour le titre.
        $this->page->addVar('title', 'Liste des '.$nombreNews.' dernières news');
     
        // On récupère le manager des news.
        $manager = $this->managers->getManagerOf('News');
     
        $listeNews = $manager->getList(0, $nombreNews);
     
        foreach ($listeNews as $news)
        {
          if (strlen($news->contenu()) > $nombreCaracteres)
          {
            $debut = substr($news->contenu(), 0, $nombreCaracteres);
            $debut = substr($debut, 0, strrpos($debut, ' ')) . '...';
     
            $news->setContenu($debut);
          }
     
        }
     
        // On ajoute la variable $listeNews à la vue.
        $this->page->addVar('listeNews', $listeNews);
     
      }
     
      public function executeShow(HTTPRequest $request)
      {
        $news = $this->managers->getManagerOf('News')->getUnique($request->getData('id'));
     
        if (empty($news))
        {
          $this->app->httpResponse()->redirect404();
        }
     
        $this->page->addVar('title', $news->titre());
        $this->page->addVar('news', $news);
        $this->page->addVar('comments', $this->managers->getManagerOf('Comments')->getListOf($news->id()));
      }
     
      public function executeInsertComment(HTTPRequest $request)
      {
        // Si le formulaire a été envoyé.
        if ($request->method() == 'POST')
        {
          $comment = new Comment([
            'news' => $request->getData('news'),
            'auteur' => $request->postData('auteur'),
            'contenu' => $request->postData('contenu')
          ]);
        }
        else
        {
          $comment = new Comment;
        }
     
        $formBuilder = new CommentFormBuilder($comment);
        $formBuilder->build();
     
        $form = $formBuilder->form();
     
        $formHandler = new FormHandler($form, $this->managers->getManagerOf('Comments'), $request);
     
        if ($formHandler->process())
        {
          $this->app->user()->setFlash('Le commentaire a bien été ajouté, merci !');
     
          $this->app->httpResponse()->redirect('news-'.$request->getData('news').'.html');
        }
     
        $this->page->addVar('comment', $comment);
        $this->page->addVar('form', $form->createView());
        $this->page->addVar('title', 'Ajout d\'un commentaire');
      }
    }

    Je pense me contenter de la solution appliquée dans ces scripts pour le moment - à moins que bien sûr tu n'entrevois une alternative probante ...

    Merci à toi en tout cas.

    Cheers,
    Marc Séon

  4. #4
    Membre éprouvé Avatar de tdutrion
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2009
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 561
    Points : 1 105
    Points
    1 105
    Par défaut
    Bonjour,

    Alors, il y a quelques trucs que j'améliorerais en fait. Tu fais par exemple un if(!$Cache->start('FrontEnd_View_Index')), mais cette méthode ne retourne pas de booléen... (pas de return du tout dans le cas principal)

    Ensuite, j'essayerais à ta place d'utiliser un code style, genre PSR2, et un outil de type php-cs-fixer. Ça améliore la facilité de lecture.

    Pour le reste, je ne vois nul part de is_file et/ou de is_readable dans le code, et c'est ça qui manque.

    N'explicite jamais error_reporting(0); dans ton code, on fait ça au niveau serveur, car tu veux le serveur de dev avec les erreurs, mais surtout pas la staging ou la prod.

    Fais-tu ça dans un cadre pro (disclaimer : si oui je vois un tas d'autres trucs à changer ) ?

    Bonne fin de weekend !

Discussions similaires

  1. Demande d'info sur MySQL 3.23.58
    Par gobs dans le forum Installation
    Réponses: 5
    Dernier message: 25/01/2006, 12h52
  2. demande d'infos sur le composant IBDataSet
    Par seb8810 dans le forum Bases de données
    Réponses: 4
    Dernier message: 18/01/2006, 15h16
  3. [Débutant] Demande d'info sur OpenGL
    Par SkyDev dans le forum OpenGL
    Réponses: 2
    Dernier message: 01/03/2005, 23h58
  4. Demande d'info sur treeview
    Par Anaxagore dans le forum IHM
    Réponses: 6
    Dernier message: 28/08/2003, 18h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo