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

PHP & Base de données Discussion :

Aide pour mise en cache de pages dynamiques


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 100
    Points : 62
    Points
    62
    Par défaut Aide pour mise en cache de pages dynamiques
    Bonjour,

    Je souhaite mettre en cache les articles de mon site, j'utilise donc ce schéma :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $expire = time() - 43200 ;//12h
    $cache = 'cache/index.html';
     
    if(file_exists($cache) && filemtime($cache) > $expire){
    	readfile($cache);
    }else{
    	ob_start();
     
    ... code à mettre en cache
     
    $cache_temp = ob_get_contents();
    file_put_contents($cache,$cache_temp);
    ob_end_clean();
    echo $cache_temp;
    Le problème est que ça met toute la page en cache, hors si on a besoin d'avoir une zone dynamique comment faire ? Je pense par exemple à une zone d'identification d'utilisateur !

    Merci de votre aide

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    C'est vrai que c'est un problème. On peut trouver quelques solutions:
    1. mettre uniquement la zone de l'article en cache (le contenu)
    2. utiliser des iframes
    3. utiliser Ajax
    4. ne pas rendre dynamique cette zone, tout simplement

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 100
    Points : 62
    Points
    62
    Par défaut
    Merci pour ta réponse.

    Vu que la requete sql sur une page article est obligatoirement en haut de page, pour pouvoir afficher title et compagnie.

    Je ne peux pas "cacher" que le contenu de l'article, le but du cache est surtout d'éviter les accès sql et temps d'exec serv.

    L'ajax pourquoi pas mais ça me semble lourd. J'imagine ne pas être le seul à me poser cette question, s'il y en a parmis vous ayant trouvé une solution miracle

  4. #4
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Je ne peux pas "cacher" que le contenu de l'article, le but du cache est surtout d'éviter les accès sql et temps d'exec serv.
    Bien sûr que si. Tu peux le mettre au niveau de l'extraction des données ou au niveau de la vue en tant que partial.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 100
    Points : 62
    Points
    62
    Par défaut
    Désolé mais je ne comprend pas ce que tu me dis

    un exemple peut être ?

  6. #6
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Ok voici ce que j'aurais fait personnellement pour une page d'article:
    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
    <?php
     
    // pas besoin d'un singleton, cette simple fonction fera l'affaire !
    function connection () {
        static $pdo;
        if (!isset($pdo)) {
            if (!func_num_args()) throw new RuntimeException("Database link is not initialized");
            list($dsn, $user, $pass, $options) = func_get_args() + array('', 'root', '', array());
            $pdo = new PDO($dsn, $user, $pass, $options);
        }
        return $pdo;
    }
     
    function fetch_article_from_database ($id) {
        $pdo = connection();
        $pdo->prepare('SELECT * FROM `articles` WHERE `id`=:id');
        if ($pdo->execute(array('id' => $id)))
            return $pdo->fetch(PDO::FETCH_ASSOC);
        return null;
    }
     
    function fetch_article_from_cache ($id) {
        if (is_file($filename = dirname(__FILE__) . "/cache/article[$id].cache"))
            return json_decode(file_get_contents($filename), true);
        return false;
    }
     
     
    function get_article ($id) {
        // si un cache existe, le renvoyer
        if ($article = fetch_article_from_cache($id))
            return $article;
     
        // sinon, réccupérer les infos depuis la base
        if (!$article = fetch_article_from_database($id))
            return null;
     
        // le mettre en cache
        file_put_contents(dirname(__FILE__) . "/cache/article[$id].cache", json_encode($article));
     
        return $article;
    }
     
    connection('mysql:dbname=testdb;host=127.0.0.1'); // initializer la connexion
     
    // JOB //
     
    // I pity the fool who doesn't sanitize user data !
    if ($article_id = file_input(INPUT_GET, 'article', FILTER_SANITIZE_NUMBER_INT)) {
        $article = get_article($article_id);
        if (!$article)
            header("HTTP/1.1 404 Not Found");
    }
     
    ?>
    <html>
    <head>
        <title><?=$article['title']?></title>
    </head>
    <body>
        <? if (isset($article)): ?>
        <article>
            <header>
                <h1><?=$article['title']?></h1>
                <p><?=$article['subtitle']?></h1>
            </header>
            <? foreach (explode("\n\n", $article['body']) as $section): ?>
            <section>
                <?=$section?>
            </section>
            <? endforeach ?>
        </article>
        <? else: ?>
        <h1>Non trouvé</h1>
        <p>L'article recherché n'existe pas...</p>
        <? endif ?>
    </body>
    </html>
    Ce cache tout simple à uniquement pour vocation de limiter les accès base, bien que dans le cas présent je doute de son efficacité. On peut mettre un mécanisme de cache plus évolué avec expiration aussi, j'ai des librairies qui font ça si tu veux.

    Note: les fonctions présentes au début du fichier doivent bien évidement être mises dans des fichiers séparés et inclus

Discussions similaires

  1. Besoin d'aide pour mise en page avec 2 images, dans un fichier xml
    Par guillaume7684 dans le forum XML/XSL et SOAP
    Réponses: 0
    Dernier message: 30/03/2011, 18h25
  2. Aide pour mise en page
    Par qwertz1 dans le forum Débuter
    Réponses: 3
    Dernier message: 27/11/2010, 15h52
  3. [Squid] Mise en cache de page dynamique
    Par Dark#Sidious dans le forum Réseau
    Réponses: 0
    Dernier message: 20/11/2008, 10h03
  4. aide pour mise en page CSS
    Par vachefolle91 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 04/03/2008, 10h24
  5. Réponses: 2
    Dernier message: 20/09/2005, 15h10

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