Publié le 18/11/2010
Auteur fobec
Réseaux sociaux
0 partages
0 tweets
0 plus
0 commentaires

Optimiser les scripts PHP avec un systeme de cache

Le site Fobec.com est hébergé sur un serveur mutualisé qui connait parfois quelques faiblesses. Le temps de chargement des pages devient long et peut atteindre 3 secondes aux heures de pointes. L'analyse des scripts PHP a permis de déterminé l'origine des lenteurs : les requêtes MySQL.

Mettre les requetes Mysql en cache

Le plus souvent, les sites internet utilisent un système de cache pour réduire la charge serveur et améliorer le temps de chargement. Le principe est 'bufferiser' la sortie d'un script PHP, stocker le code HTML dans un fichier et charger la page à partir du cache.
Au lieu de réécrire une partie de l'architecture du site Fobec.com, nous avons décider de stocker uniquement le résultat de certaines requêtes MySQL et non l'ensemble du code HTML d'une page.

Class php de cache fichier

Le but de la class est de charger et de stocker les requetes MySQL dans un fichier
- Enregistrer: les données issues de la requête SQL sont sérialisées puis enregistrer dans un fichier.
- Charger: chargement du fichier cache puis desérialisation des données.
- le paramètre $maxage fixe le délai maximal de validité des données mises en cache.
<?php
/**
 * LocalFileCache: charger et enregistrer des requetes MySQL dans un fichier
 *
 * @author Fobec 2010
 */
class LocalFileCache {
 
    /**
     * Enregistrer le contenu d'un array dans un fichier
     * @param array $resultset
     * @param string $file fichier de destination
     * @param boolean $error transmettre les erreurs
     */
    public static function saveQuery(array $resultset, $file, $error=null) {
        $data=serialize($resultset);
 
        $fhandle=@fopen($file,'w');
        if ($fhandle) {
            fwrite($fhandle, $data);
            fclose($fhandle);
        } else if (isset($error)) {
            throw new Exception("File writing denied to ".$file." !!!");
        }
    }
 
    /**
     * Charger le contenu d'un array à partir d'un fichier
     * @param string $file fichier de cache
     * @param int $maxage validité max. du cache en sec, 10800 => 3 heures
     * @param boolean $error transmettre les erreurs
     * @return array
     */
    public static function loadQuery($file, $maxage=null, $error=null) {
        if (!file_exists($file)) {
            if (isset($error)) {
                throw new Exception("Unknow file ".$file." !!!");
            }
            return null;
        }
 
        //hors delai, cache perimé 
        if (isset($maxage)) {
            $filedate=filemtime($file);
            if ((time()-$filedate)>$maxage) {
                return null;
            }
        }
 
        $fhandle=@fopen($file,'r');
        if ($fhandle) {
            $buf=stream_get_contents($fhandle);
            return unserialize($buf);
            fclose($fhandle);
        } else if (isset($error)) {
            throw new Exception("File reading denied to ".$file." !!!");
        }
    }
}
?>

Exemple d'utilisation dans une class Model

En suivant le principe MVC, une class model a pour but d'acquérir et de formater des données. La mise en place du cache charge les données en priorité à partir d'un fichier au lieu d'effectuer systématiquement une requête MySQL.
/**
 * Sélectionner TOP 5 articles populaires
* @return array
 */
public function Top5_article() {
    $f=$_SERVER['DOCUMENT_ROOT'].'/cache/Top5MostView.dat';
 
    /** Lecture à partir du fichier cache */
    $validity=1*60*60; //1 heure
    $rs=LocalFileCache::loadQuery($f, $validity);
    if (isset($rs)) {
        return $rs;
    } else {
        ...
       $rs=mysql_query ($SQL);
        ...
        }
 
        /* Ecriture du cache */
        LocalFileCache::saveQuery($rs, $f);
        return $rs;
    }  
}


Mettre en cache les pages HTML
Il existe plusieurs manières d'optimiser les scripts PHP, que ce soit en 100% cache HTML ou que ce soit en stockant les requêtes MySQL. Chacune des méthodes à ses forces et ses faiblesses, le choix se fait par rapport à l'architecture du site.

Ajouter un commentaire

Les champs marqués d'un * sont obligatoires, les adresses emails se sont pas publiées.

A lire aussi

Réseaux sociaux
Présentation de l'article
Catégorie
tuto - webmaster
Mise a jour
18/11/2010
Visualisation
vu 3211 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 261 articles
|BIO_PSEUDO|
Commentaires récents

Publié par Diégo DELPY dans CMS

IL FAUT IMPERATIVEMENT DONNER DES CHEMINS COMPLETS à pFrom et à pTo, sinon ça marche
bizzarrement.
Exemple :

// Chemin relatif : PAS BON !
pFrom := \'Bureau\\Télécharg...

Publié par Laurent dans java

Merci :)
Teste sous Linux CentOS, fonctionne mais ne recouvre pas la barre des taches.

Publié par Celibataire dans news

Le trustrant est pas clair du tout peu d'informations sont disponibles sur lui!

Publié par Tchatche dans news

Salut a tous,
@ Outsourcing je suis tout a fait d'accord avec toi que le Pagerank d'un site (ou page) n'est pas un gage de bonnes positions sur Google,on peut tous citer des sites ay...

Publié par Kachwahed dans CMS

Merci, ca marche avec moi, mais apès avoir changer:
Edit1.Text := Format('%d bits, %d x %d',[Bits, HRes, VRes]);
par:
Edit1.Text := Format('%d bits, %d x %d',[Bits, HorizRes, VertRes]); <...