Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les tutoriels > Non-Officiels > Site Web > PHP > Optimisation & Sécurité > Système de cache de Dr Night > Lecture des commentaires

Système de cache de Dr Night

Vous devez être inscrit pour pouvoir poster des messages

Page : 1  2  Suivante
Pseudo Commentaire
Page : 1  2  Suivante
Hors ligne MS-DOS_1991 # Posté le 22/11/2006 à 17:35:06 - Ce membre a mis la note : 18
www.newbie-project.net
Avatar
Groupe : Membres
Très bon tuto , tu expliques bien, en détaillant et en commentant tes codes :)

Je n'avais jamais pensé à faire mon script de cache comme cela, et c'est vrai que ça semble assez performant pour faire tourner un forum :o :p

18 / 20 ;)

» Newbie-Project «
Newbie-Forum -- Newbie-Directory (nouvelle version disponible ! ^^ )
 
Hors ligne Jeremie78 # Posté le 23/11/2006 à 16:21:07 - Ce membre n'a pas mis de note
Powered by GNU/Linux
Groupe : Membres
Citation : Pas de titre
get_cache(nom_cache)

J'ai moi aussi fait mon propre système et j'ai mis le même pour cette fonction ^^
ça doit être commun parce que c'est pas la première fois que je le voit :lol:
par contre moi j'ai mes fonctions de cache et même si je peut pas supprimer un fichier (cette fonction ne me sert pas) je trouve mes fonctions plus poussée au niveau des paramètres :
Code : PHP
// MISE EN CACHE
function cache_data($nom_fichier, $data, $ouverture='w+')
{
        $handle = fopen('cache/' .$nom_fichier. '.cache', $ouverture);
        fwrite($handle, $data);
        fclose($handle);
}
// récupérer le cache
function get_cache($nom_fichier, $ouverture='r', $modeLigneALigne=false)
{
        $handle = fopen('cache/' .$nom_fichier. '.cache', $ouverture);
        // le fichier n'existe pas => on le créé
        if(!$handle)
        {
                $handle = fopen('cache/' .$nom_fichier. '.cache', 'a');
        }
       
        // mode ligne à ligne
        if($modeLigneALigne == true)
        {
                $fichier = null;
                $nb_lignes = 0;
               
                while(!feof($handle))
                {
                        $fichier []= fgets($handle, 4096);
                        $nb_lignes++;
                }
                fclose($handle);
               
                $RETURN = array($fichier, $nb_lignes);
        }
        else//mode normale
        {
                $fichier = null;
                while(!feof($handle))
                {
                        $fichier .= fgets($handle, 4096);
                }
                fclose($handle);
               
                $RETURN = $fichier;
        }
       
        return $RETURN;
}

Web-Modules : outils pour webmasters (compteurs, tchat, news ...) à installer sur son site, générateur de bannières, de userbars, ...
 
Hors ligne MS-DOS_1991 # Posté le 23/11/2006 à 17:44:29 - Ce membre a mis la note : 18
www.newbie-project.net
Avatar
Groupe : Membres
Perso, j'ai un peu remanié le code en en faisant une classe, pour ne plus supprimer le fichier de cache mais tout simplement le vider puis réécrire dedans :

Code : PHP
<?php
class Cache
{
  public function exists ($cache_filename)
  {
    return (is_file(QC_APP_PATH.'/inc/cache/'.$cache_filename.'.cache.php')) ? true : false;
  }
 
  public function getDataFromFile ($cache_filename)
  {
    include (QC_APP_PATH.'/inc/cache/'.$cache_filename.'.cache.php');
    return $cache_content;
  }
 
  public function createFile ($cache_filename, $cache_content)
  {
    $cache_content = serialize($cache_content);
    $cache_content = str_replace(array('\\', '\'', "\0"), array('\\\\', '\\\'', '\\0'), $cache_content);
    $cache_content = '<'.'?php $cache_content = unserialize(\''.$cache_content.'\'); ?'.'>';

    $cache_file = fopen(QC_APP_PATH.'/inc/cache/'.$cache_filename.'.cache.php', 'w');
    fwrite($cache_file, $cache_content);
    fclose($cache_file);
  }
}
?>


on l'utilise comme ceci:

Code : PHP
if (!$Cache->exists('name_of_the_data'))
{
  /** Execute SQL Queries and parse everything to an object / array **/
  $my_data = $MyClass->getSomeSQLData();
  /** Create the cache file, which will be used for any following query **/
  $Cache->createFile('name_of_the_data', $my_data);
}
else
  $my_data = $Cache->getDataFromFile('name_of_the_data');
var_dump($my_data);


... et ça roxxe niveau rapidité :p :p

edit: ne vous occupez pas de la constante QC_APP_PATH, disons juste qu'elle contient le chemin absolu vers la racine de votre site ;)

» Newbie-Project «
Newbie-Forum -- Newbie-Directory (nouvelle version disponible ! ^^ )
 
Hors ligne Jeremie78 # Posté le 24/11/2006 à 17:55:24 - Ce membre n'a pas mis de note
Powered by GNU/Linux
Groupe : Membres
Je suis un peu sceptique fasse à l'utilité d'une classe pour un système de cache
L'intérêt est il me semble assez limité et il est même plus long d'utiliser (pas de faire tourner) ta classe pour récupérer/écrire dans un fichier.
Pour ce point là, il me semble que de simple fonctions suffisent ;)

Web-Modules : outils pour webmasters (compteurs, tchat, news ...) à installer sur son site, générateur de bannières, de userbars, ...
 
Hors ligne MS-DOS_1991 # Posté le 24/11/2006 à 20:01:27 - Ce membre a mis la note : 18
www.newbie-project.net
Avatar
Groupe : Membres
J'en ai fait une classe tout d'abord pour rendre mon code plus "lisible" : if ($Cache->exists) se lit très bien en anglais normal comme "si le cache existe"), mais aussi afin de pouvoir éventuellement rajouter d'autres méthodes aisément plus tard, quand j'aurai besoin par exemple d'alterner celui-ci avec un autre type de cache (à durée de vie par exemple) ;)

» Newbie-Project «
Newbie-Forum -- Newbie-Directory (nouvelle version disponible ! ^^ )
 
Hors ligne docteur.night # Posté le 25/11/2006 à 17:45:17 - Ce membre n'a pas mis de note
jamais 203, alors 204 !
Avatar
Groupe : Membres
Le but de ce tutorial est d'expliquer une façon de faire un système de cache simplement. Ensuite on peut le mettre à toutes les sauces, ça dépend de ce qu'on veut en faire ;) .
 
Hors ligne DexteR # Posté le 12/01/2007 à 23:20:44 - Ce membre a mis la note : 19
teR ... DexteR
Avatar
Groupe : Membres
19/20 car les codes sont propres et clairement expliqués, merci grace a toi je vien d'en apprendre encore plus sur PHP ...

DexteR ;)

N'allez pas voir mon site se n'est que des tests...
 
Hors ligne jojolapine # Posté le 09/03/2007 à 14:40:05 - Ce membre a mis la note : 16
Avatar
Groupe : Membres
Bonjour,
J'ai bien aimé le tuto...!
Il est clair explicite, très bien! je met 16/20
Mais j'aimerai aussi montrer qu'il y a une autre façon de voir un sytème de cache...
Le principe reste le même sur les fichiers (si le fichier existe ben on le lit sinon on va chercher les infos...)
Seulement, dans le fichier, je ne stocke pas des données php, mais du code généré...
Pour ce faire, je me sert de la bufferisation...
bref voici ma classe:Code : PHP

<?php
/**
 * Classe cache
 * Gestion d'un système de cache
 *
 *
 * Exemple d'utilisation :
 * <?php
 * include('cache.class.php');
 * $cache = new cache('cachetest');
 *
 * $cache->initCache();
 *
 * echo microtime();
 *
 * $cache=null;
 * ?>
 *
 * @author Joris Mulliez
 * @package Cache
 */

class cache{
   
    /**
     *  Dossier où l'on stocke les fichiers de cache
     */

    const DOSSIER='./';
   
    /**
     *  Extension des fichiers
     */

    const EXTENSION='.cache.html';
   
    /**
     *  Nom du fichier traité
     */

    private $file=null;
   
   
    /**
     * Constructeur
     *
     * prend en paramètre le nom du fichier *.php, sans l'extension .php
     * @param String $file
     * @return void
     */

    public function __construct($file){
        $this->file=$file;
    }
   
    /**
     * Fonction initCache
     * Si le fichier de cache correspondant ) $this->file existe, on l'inclu, et on arrête tout
     * sinon on démarre la temporisation...
     */

    public function initCache(){
        if(file_exists(self::DOSSIER.$this->file.self::EXTENSION)){
            readfile(self::DOSSIER.$this->file.self::EXTENSION);
            exit();
        } else {
            ob_start();
        }
    }
   
    /**
     * Fonction clearCache
     * supprime le fichier de cache
     */

    public function clearCache(){
        if(file_exists(self::DOSSIER.$this->file.self::EXTENSION))
            unlink(self::DOSSIER.$this->file.self::EXTENSION);
    }

    /**
     * Fonction _destruct
     * récupère le fruit de la temporisation et le stocke dans le fichier de cache, puis affiche
     * le résultat de la page
     */

    public function __destruct(){
        $content=ob_get_flush();
        file_put_contents(self::DOSSIER.$this->file.self::EXTENSION,$content);
    }
}
?>
et elle s'utilise comme ceci:
Code : PHP
<?php
include('cache.class.php');
$cache = new cache('cachetest');
$cache->initCache(); // on vérifie si un fichier de cache existe ?, si oui il est inclu, et on stoppe tout...
// sinon on récupère la sortie standard et on balance le tout dans un fichier
?>
içi on met tout le code html et php que l'on veut...
<?php
$cache=null; // destruction de l'
objet
?>

et pour effacer les cache, il suffit d'appeler la méthode cache::clearCache()!
qu'est-ce que vous pensez de ce système ?

Image utilisateur
 
Hors ligne docteur.night # Posté le 10/03/2007 à 17:32:03 - Ce membre n'a pas mis de note
jamais 203, alors 204 !
Avatar
Groupe : Membres
C'est en effet une autre solution, mais elle ne répond pas forcément aux mêmes besoins. Ta solution doit être légèrement moins lourde, mais celle que je propose permet de faire ce qu'on veut des données mises en cache : je met en cache les données, et ensuite je le met dans du html si besoin etc....
Mais ta solution peut avoir aussi ses intérêt. A chacun de voir en fonction de ses besoins. ;)
 
Hors ligne Gu1ll4um3r0m41n # Posté le 24/03/2007 à 18:26:51 - Ce membre a mis la note : 10
Groupe : Membres
Ce genre de systeme n'est pas très "secure"...
(Voir faille sur wordpress dans le systeme de cache ici: ICI)
Hors ligne Zhenty # Posté le 02/04/2007 à 18:03:03 - Ce membre n'a pas mis de note
Avatar
Groupe : Membres
Juste une petite modification :

Code : PHP

        foreach ( $donnees as $ligne )
                {
                if($ligne != NULL)
                        {
                        }
                }


Après, j'ai peut-être tord ;) Sinon, 18/20 pour ce tutorial très bien expliqué, et permettant de faire un pas de plus dans l'optimisation de son site.
Hors ligne docteur.night # Posté le 03/04/2007 à 10:17:26 - Ce membre n'a pas mis de note
jamais 203, alors 204 !
Avatar
Groupe : Membres
Gu1ll4um3r0m41n, ça serait sympa si tu pouvais être plus précis sur la sois-disante faille, parce que pour le moment je ne vois pas.

Zhenty, ta condition avec NULL est inutile, le foreach s'arrete quand il n'y a plus d'éléments.
 
Hors ligne Sayrus # Posté le 24/04/2007 à 15:05:04 - Ce membre n'a pas mis de note
Groupe : Membres
Bonjour,

Comment pourrais-je adapter ce système de mise en cache pour l'utiliser de la manière suivante:

Plusieurs news peuvent-être affichées page par page...

Comment mettre cela en cache? :o

Sayrus
 
Hors ligne RockBoy83 # Posté le 15/05/2007 à 17:28:04 - Ce membre a mis la note : 18
Avatar
Groupe : Bannis
Salut :)

Vraiment bien ce tuto, j'ai appris beaucoup de chose et je vais mettre mon propre système pour mon jeu comme sa, je n'utiliserai presque pas la base de donnée que des fichiers en .php :)

Merci,

Je te met un :( ....8 :(
Voir ici aussi -> Secret (cliquez pour afficher)
;) Mince j'ai oublier le 1 ^^, sa fais 18/20 ;)


Merci,
@+

Image utilisateur
 
Hors ligne Amrac # Posté le 11/07/2007 à 02:04:11 - Ce membre n'a pas mis de note
Groupe : Membres
Efficace et facile a mettre en place, le pied :)

20/20
Hors ligne bilou89 # Posté le 15/07/2007 à 14:39:28 - Ce membre a mis la note : 20
Groupe : Membres
Bonjour,

Tuto court, clair, précis en 20mn je l'ai mit en place sur mon système de news (juste les news pour le moment ^^ ).

Je tiens juste à dire que j'ai du rajouter un if ($ligne != NULL) dans le foreach car il me créer une news vide.

Je vais maintenant le mettre en place sur mes autres modules :) .

Un p'tit 20 au passage car ce tuto le mérite vraiment, GG .

Image utilisateur
 
Hors ligne Bqrt # Posté le 26/08/2007 à 14:15:14 - Ce membre a mis la note : 16
La petite rime assassine ....
Avatar
Groupe : Membres
J'allais utiliser l'autre système de cache, mais celui la me parait plus pratique :)

Bravo pour ce tuto bien expliqué, par contre je pense que je vais générer des fichiers html, pour soulager aussi le serveur apache, et pas seulement mysql ;)

J'ai essayé aussi avec la bufferisation mais c'est moins "maniable" je trouve.

EDIT : en fait j'ai bien compris pourquoi utiliser le php pour ce système de cache, et sa marche remarquablement bien :D bravo donc, mais les 2 systèmes ont leur utilité, je vais donc utiliser les 2 ^^

J'veux pas perdre 1 heure pour l'avenir de mon pays, par contre j'ai voté contre harlem a la star academy (© Le Puzzle)

Mon profil Last.fm : http://www.lastfm.fr/user/Bqrt/
 
Hors ligne Zakmaf # Posté le 09/09/2007 à 18:05:51 - Ce membre a mis la note : 18
Avatar
Groupe : Membres
Même problème que sayrus :o

Sinon je mets 18/20 c'est vraiment trop bien comme tuto !
Hors ligne Lynix # Posté le 27/10/2007 à 15:14:06 - Ce membre a mis la note : 16
Graphiste 3D
Avatar
Groupe : Membres
docteur.night : J'ai mis le if ($ligne != NULL) et le problème que j'obtenais a disparu, en effet j'avais une ligne en trop et vide, j'essaye de modifier la mise en cache pour éviter de mettre cette ligne

Ha oui, un petit 16 :)

EDIT : voila, j'ai fait mon code :
Code : PHP - Afficher / masquer les numéros de ligne


la seule différence se situe au niveau du array_slice, je vais le mettre dans le fonction de cache

Utopy Bientot :D
 
Hors ligne WildKiller # Posté le 08/01/2008 à 19:14:56 - Ce membre a mis la note : 18
Ya un truc
Avatar
Groupe : Membres
Bon tuto :)
Système de cache installé en 1/4 d'heure!

Encore bravo (18/20).
 
Hors ligne mikaweb # Posté le 11/01/2008 à 21:29:53 - Ce membre n'a pas mis de note
Groupe : Membres
Bonsoir,

j'ai une petite question :D

J'aimerais utiliser ce système avec une pagination donc dans un système ou il y a au moins 2 requetes différentes.

Actuellement je n'ai trouvé qu'une parade qui me permet d'économiser une seule requete sur les deux, la seconde requete se fait lors de chaque chargement de page alors que la première, fonctionne impec.
Petite économie mais je suis sur que y a moyen de faire encore une meilleur économie :p

Actuellement j'ai quelque chose dans le style :
Code : PHP - Afficher / masquer les numéros de ligne
  1. <?php
  2. $nb_results_p_page              =       10;
  3. $nb_avant                               =       4;
  4. $nb_apres                               =       6;
  5. $premiere                               =       1;
  6. $derniere                               =       1;
  7. $courant                                =       empty($_GET['page']) ? 1 : $_GET['page']; // page
  8. $start                                  =       ($courant - 1) * $nb_results_p_page; // start (requete mysql)
  9.  
  10.  
  11. $ret = get_cache('listing');
  12. if ($ret == false)//S'il n'existe rien.
  13. {
  14.     // le cache n'existe pas, récupération des messages dans la base de données
  15.     $result = $db->query('SELECT count(*) FROM news WHERE valide=1') or die(mysql_error());
  16.  
  17.     // stockage du résultat dans la variable
  18.     $ret = array();
  19.     $ret = $db->fetch_array($result);
  20.  
  21.     // mise en cache
  22.     create_cache('listing', $ret);
  23. }
  24.  
  25. // nombre de lignes
  26. $nb_results = $ret[0];
  27.  
  28. $result = $db->query('SELECT id,titre,pseudo,timestamp_proposition,timestamp_modification,valide FROM news ORDER BY timestamp_validation DESC LIMIT '.$start.', '.$nb_results_p_page.'') or die(mysql_error());
  29. // nombre total de pages
  30. $nb_pages = ceil($nb_results / $nb_results_p_page);
  31. // nombre de pages avant
  32. $avant = $courant > ($nb_avant + 1) ? $nb_avant : $courant - 1;
  33. // nombre de pages après
  34. $apres = $courant <= $nb_pages - $nb_apres ? $nb_apres : $nb_pages - $courant;
  35. ?>


Quel serait le moyen d'optimiser tout ceci ? Utiliser 2 fichiers caches différents ?

Edit: Au passage, c'est mieux d'économiser une requete ou bien vu le temps que on cherche les infos dans le fichier en cache sa compense ?

C'est mieux de mettre une page complète, ou seulement les requetes ?
Je crois que ce tuto, fais la page complète si j'ai bien compris.
http://www.siteduzero.com/tuto-3-23720-1-comprendre-et-utiliser-un-systeme-de-cache-php.html


Merci ;)
 
Hors ligne docteur.night # Posté le 11/01/2008 à 22:49:44 - Ce membre n'a pas mis de note
jamais 203, alors 204 !
Avatar
Groupe : Membres
Sans mettre toute la page en cache, tu peux mettre en cache les données que tu as créées à partir de tes deux requêtes :
Toutes les variables que tu as récupérées grâce a ces deux requêtes, tu les met dans un tableau et tu met ce tableau en cache.
 
Hors ligne rodulphe # Posté le 17/01/2008 à 16:55:08 - Ce membre a mis la note : 19
Groupe : Membres
Rien à dire
Tu as tout bien expliqué
Merci beaucoup !!
Hors ligne Savageman # Posté le 25/02/2008 à 23:15:13 - Ce membre n'a pas mis de note
Insa : If inside
Avatar
Groupe : Membres
Pas de note, juste un commentaire :
Si un utilisateur insère du code PHP dans ton cache, il peut potentiellement te hacker de la même façon qu'avec la faille wordpress ci-dessus.

Une autre technique consisterait à faire ceci :
Code : PHP - Afficher / masquer les numéros de ligne
  1. <?php
  2. // met en cache une variable
  3. function create_cache($nom_cache, $contenu)
  4. {
  5.         // utilisation de serialize() pour transformer $content en chaine de caractères
  6.         $contenu = serialize($contenu);
  7.        
  8.         // écriture du code sérializé dans le fichier
  9.         $fichier = fopen('./cache/donnees_' . $nom_cache . '.php', 'w');
  10.         $resultat = fwrite($fichier, $contenu);
  11.         fclose($fichier);
  12.  
  13.         // renvoie true si l'écriture du fichier a réussi
  14.         return $resultat;
  15. }
  16.  
  17. // récupère une variable mise en cache
  18. function get_cache($nom_cache)
  19. {
  20.         // vérifie que le fichier de cache existe
  21.         if ( is_file('./cache/donnees_' . $nom_cache . '.php') )
  22.         {
  23.                 // le fichier existe, on récupère le contenu de $cache et on désérialize
  24.                 $cache = file_get_contents('./cache/donnees_' . $nom_cache . '.php');
  25.                 return unserialize($cache);
  26.         }
  27.         else
  28.         {
  29.                 // le fichier de cache n'existe pas, on retourne false
  30.                 return false;
  31.         }
  32. }
  33.  
  34. En plus le code est plus court et plus simple. ;)

Absent du 27 novembre au 15 décembre.
Image utilisateur
Image utilisateur
 
Hors ligne docteur.night # Posté le 26/02/2008 à 02:18:50 - Ce membre n'a pas mis de note
jamais 203, alors 204 !
Avatar
Groupe : Membres
L'utilisateur n'a pas à insérer de code php dans le cache. Le contenu qui est mis en cache doit être valide et sécurisé. C'est au programmeur de bien vérifier que ce qu'il met en cache n'est pas dangereux.
Dans l'exemple du tutoriel, les données mises en cache proviennent de la base de données. J'ose espérer que ces données ont déjà été protégées/échappées comme il faut !
 
Hors ligne Savageman # Posté le 26/02/2008 à 13:15:39 - Ce membre n'a pas mis de note
Insa : If inside
Avatar
Groupe : Membres
Bah... C'est pas forcément évident que les données de la base de données sont protégées... On les a protégées pour éviter la faille SQL lors de l'insertion en base, mais les données n'ont pas été modifées. En général, on préfère même garder les données comme elles viennent pour une question d'intégrité, et non pas des données déjà modifiées... La protection se fait à l'affichage ensuite.
Ensuite, mon code est plus court, plus simple et plus sécurisé, alors je ne vois pas pourquoi s'en priver. :s

Absent du 27 novembre au 15 décembre.
Image utilisateur
Image utilisateur
 
Hors ligne rockraider # Posté le 29/02/2008 à 19:24:06 - Ce membre a mis la note : 19
Groupe : Membres
Excellent, super clair, précis, rapide à mettre en place, efficace !
Je te mets (seulement) 19 parce qu'il aurait été judicieux de proposer de mettre un .htaccess en "deny from all" dans le dossier cache pour pas se faire pirater trop facilement les données mises en cache (on télécharge le fichier -> unserialize et c'est foutu)
Hors ligne docteur.night # Posté le 01/03/2008 à 10:13:29 - Ce membre n'a pas mis de note
jamais 203, alors 204 !
Avatar
Groupe : Membres
Si on ne fait pas la modification de Savagement, il n'y a pas besoin d'un .htaccess pour que le contenu ne soit pas accessible.
Dans mon système, les fichiers de cache sont en php. On ne peut pas télécharger le contenu d'un fichier php. Tout ce qu'on peut télécharger, c'est ce qu'affiche le fichier php. Ici en l'occurence, il affichera... rien ! ;)
Mais bon un .htaccess avec deny from all est une couche sécurité en plus dira-t-on.
 
Hors ligne BkM- # Posté le 18/04/2008 à 14:05:03 - Ce membre a mis la note : 18
BrokenKillMaster-
Avatar
Groupe : Membres
J'ai une petite question: comment fait le site du zéro pour afficher une page différente par page de forum au lieu de forum=25&topic=12?
Il met en cache tout le code html de chaque page?! o_O Enfin ça m'étonnerai vu le nombre de pages que ça fait à héberger...
J'ai mis 18 sinon :)

Après le courant, découvrez la connexion alternative. Merci Club Internet! ~ 0.1Mo/s
Image utilisateur
 
Hors ligne frdemahieu # Posté le 31/05/2008 à 11:22:26 - Ce membre n'a pas mis de note
Le codex un art un choix.
Avatar
Groupe : Membres
Ce serait chouette pour un meilleur visibilité du code mettre les accolade <?php ?>.
Sinon très bien fait.

Inscrivez-vous à la revue informatique clicpourtous
C'est gratuit vert et ils attendent des personnes
inscrite !!!
Présentation sur le sdz : http://www.siteduzero.com/forum-83-311 [...] rmatique.html
Venez vois mes réalisation graphique : http://frdemahieu.skyrock.com
 

Vous devez être inscrit pour pouvoir poster des messages

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 362 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.1167s (0.1017s)