[script] Mise en cache des pages PHP

WRInaute passionné
Bonjour,

J'ai un soucis dans l'utilisation d'un script similaire.

J'ai besoin de mettre en cache qu'une seule partie de ma page qui est structurée grossièrement de cette manière :

- header
- contenu
- footer

Je souhaite mettre en cache seulement le contenu, mon soucis, c'est que lorsque le cache est activé, mes pages n'affichent plus le footer. Comment faire pour que le reste de la page continue d'être active ?

Ma mise en cache se termine par :
ob_end_flush();
clearstatcache();

Merci.
 
WRInaute accro
Robinson a dit:
mon soucis, c'est que lorsque le cache est activé, mes pages n'affichent plus le footer.
Ma mise en cache se termine par :
ob_end_flush();
Vue que tu as utilisé autre chose c'est sûrement pas utile mais il me semble que ob_end_flush() vide le cache sur la ligne et clôture la connexion apache ce qui explique qu'après cette ligne tu peu pisser dans un violon ça fera pas parti du concerto.
 
Nouveau WRInaute
Honnêtement, question cache, un framework comme Smarty, dès lors qu'on sait correctement l'utiliser et pas comme un simple générateur de HTML, c'est la solution ultime...

On peut choisir de mettre en cache une partie de la page et pas le reste, définir à quel moment une page est obsolète, si elle doit perdurer x heures, x jours...

Et quand on travaille à plusieurs sur un site, intégrateurs et développeurs, scinder la partie code de la partie rendu HTML, c'est le pied !

pH
 
WRInaute accro
WRInaute accro
Je profite du up sur le sujet pour glisser dans l'oreille de ceux qui ont des soucis pour la mise en cache de "blocs" et qui veulent donc conserver une partie dynamique sur leur page, ce sera par exemple le cas si vous y avez un formulaire avec un captcha, qu'il y a toujours moyen de placer le code dynamique dans un dossier non traité par le système de cache et de l'inclure dans la page "cachée" via une iframe.
 
WRInaute discret
Salut tout le monde,

Je suis nouveau sur ce post, sur ce forum et dans le magnifique monde du développement web! Donc priez de m'excuser si je ne vous suis pas toujours très bien...

Alors ce message est en réponse a un post que voici: https://www.webrankinfo.com/forum/t/quest-ce-qui-ralentit-un-site-web.175081/#p1492934

Sur ce post j'avais demandé ce qui ralentissait une page web, Bigb06 et les autres mon aiguillé vers la mise en cache. Et j'ai choisi de répondre ici car je pense que j'aurais plus de réponse et c'est mieux adapté a ma question ;-)

Donc voila j'ai (essayer de ) lire/lu les réponses de ce sujet. J'ai deja compris certaines choses et voila comment je l'ai comprises:

On crée un fichier cache dans un répertoire ' cache/ ' nommé ' cache + nom-de-la-page ',

On teste si le cache existe,

S'il n'existe pas (
On démarre le buffer, et si je comprends bien le buffer sert a empêcher le code qui suit la commande qui démarre le buffer, de ne pas être envoyé vers le navigateur.

Ensuite on écrit le code qu'on veut mettre en cache. Apres le démarrage du buffer.

Ce code est, si je comprends bien une page html crée par du php à laide de requêtes sql? Du style une liste de film, fichier, membres, info sur membres, etc. Le fichier obtenu est stocké en html dans le répertoire cache/ .
)
S'il existe (
On va le chercher dans ce fameux répertoire cache/ et on génère la page html)

--> Si je comprends bien on gagne en performance car on génère une page html a la place d'une page php ...

--> On devra mettre dans la page une ligne: Include('chemin-du-fichier-correspondant-a-cette-page-en-cache'); ou bien allons nous devoir utiliser du url Rewriting?

Et avons-nous besoins d'une extension style APC pour utiliser le buffer etc?

Est-il plus performant d'utiliser l'extension APC ou bien cela revient au même?



! Ce qui suit n'est que utile si vous
mieux comprendre comment est construit mon site web et ce que je pensais mettre en cache !

Le but de mon site est de créer une grande 'collection' de résumes d'école...

Alors j'ai une page (par exemple: liste-resume.php) qui 'liste' les résumés existant ainsi qu'un formulaire pour effectuer une recherche. Quand ils cliquent sur un résumés dans la liste ils sont dirigés vers une page du style: résume.php?nom=[Nom-du-résume] qui va chercher les infos du résumés en mysql.

Le but ce serait de mettre chaque page résume.php?nom=[Nom-du-résume] qui est propre et différente a chaque résumés en cache pour éviter a la page résume.php de devoir a chaque fois aller rechercher les données dans la bdd ...

! Le message qui est inutile est finie !

Merci beaucoup et @+

Matthieu
 
WRInaute impliqué
Salut tous le monde !

Ce post à été crée en 2005.
On est en 2015, soit 10 ans plus tard ( le temps passe vite.... ) :mrgreen:

Il n'existe toujours pas de solution pour faire automatiquement la même chose que ce script ?
PHP ? un mod apache ? Que sais-je encore ?
 
WRInaute accro
Bonjour

Merci beaucoup à Fandecine et à focoweb.fr dont j'ai utilisé la classe pour mon site.

Je regarderai demain pour les quelques pages qui ne sont pas encore sous cache.

Respects.
 
WRInaute accro
Bonjour

Depuis longtemps, j'ai adapté le script de fandecine pour qu'il gère les Content Security Policy ( CSP ).

Il fonctionne sur mon site.

Le script génère en dynamique les attributs nonce="valeur" des scripts dans le html, il suffit de mettre dans le html en amont, le nonce="%CSP_NONCE%".

Le script génère aussi les headers ah hoc.

Cà fait très longtemps que je n'ai pas vérifié le code du script.

Le script fait 15521 octets et 591 lignes.

Souhaitez-vous que je le donne aux wrinautes sur ce thread ?

Je le copie-colle de suite si vous voulez.
 
WRInaute accro
Bon, bon spout...

3 scripts php :


PHP:
class Semaphore_non_blocking {

    const SHARED_MEMORY    = 100;

    const LOG_FILE = "/var/www/html/shm_log/cache.txt";

    private $FILE_NAME        = null;

    private $IS_CACHE        = null;

    private $result_lock        = null;

    private $log            = null;

    private $fp_log            = null;

    private $projectId        = null;

    private $resourceSemaphore    = null;

    private $tokenSemaphore        = null;

    private $tokenValue        = null;

    private $resourceSemaphoreKey    = null;

    private $tokenSemaphoreKey    = null;

    private $tokenValueKey        = null;

    public function __construct($filename, $is_cache = false) {

        $this->FILE_NAME = $filename;

        $this->IS_CACHE = ($is_cache === false) ? "FALSE" : "TRUE";

        if($is_cache === false) {

            $this->projectId    = "aplusbegalix";

        } else {

            $this->projectId    = "abraracourcix";

        }

        $var = $filename . "_" . $this->projectId;

        $this->resourceSemaphoreKey    = $this->tmp_ftok($var, "n");

//        echo "\t\t" . '$this->resourceSemaphoreKey = ' . $this->resourceSemaphoreKey . "<br><br>\n";

        $this->tokenSemaphoreKey    = $this->tmp_ftok($var, "sy");

//        echo "\t\t" . '$this->tokenSemaphoreKey = ' . $this->tokenSemaphoreKey . "<br><br>\n";

        $this->tokenValueKey        = $this->tmp_ftok($var, "u");

//        echo "\t\t" . '$this->tokenValueKey = ' . $this->tokenValueKey . "<br><br>\n";

        if(($this->resourceSemaphoreKey    === false) ||
            ($this->tokenSemaphoreKey === false) ||
            ($this->tokenValueKey === false)) {

            echo "failed to get key of semaphore. <br>\n";

            return false;
        }

        $this->resourceSemaphore = sem_get($this->resourceSemaphoreKey, 1, 0666, true);

        $this->tokenSemaphore = sem_get($this->tokenSemaphoreKey, 1, 0666, true);

        $this->tokenValue = shm_attach($this->tokenValueKey, self::SHARED_MEMORY, 0666);

        if(($this->resourceSemaphore === false) ||
            ($this->tokenSemaphore === false) ||
            ($this->tokenValue === false)) {

            echo "failed to get semaphore. <br>\n";

            return false;
        }

        $this->result_lock = $this->LOCK();

        return $this;
    }

    public function __destruct() {

        if($this->result_lock) {

            $this->release();
        }

        @shm_detach($this->tokenValue);
    }

    private function tmp_ftok($filename = "", $proj = "")
    {
        if(empty($filename))
        {
            return false;
        }

        $var = $filename . (string)$proj;

        //        $nbre  = (int)floor(hexdec(hash('sha256', $var)) / 2147483647214748364721474836472147483647214748364721474836472147483);

        $nbre  = (int)floor(hexdec(hash('sha256', $var)) / ((16 ** 64) / 9223372036854775000.0));

        return $nbre;
    }

    private function myEcho($v) {

        return  "\t\t" . $v  . ' à : ' . microtime(true) . "\n";
    }

    private function try_lock() {

        @sem_acquire($this->tokenSemaphore);
        $tmp = @shm_get_var($this->tokenValue, $this->tokenValueKey);
        $exit = $tmp;
        if (!$exit) {
            $tmp = @shm_put_var($this->tokenValue, $this->tokenValueKey, true);
//            $tmp = @shm_get_var($this->tokenValue, $this->tokenValueKey);
        }
        @sem_release($this->tokenSemaphore);
        if ($exit) return false;
        @sem_acquire($this->resourceSemaphore);
        return true;
    }

    private function release() {

        @sem_release($this->resourceSemaphore);
        @sem_acquire($this->tokenSemaphore);
//        $tmp = @shm_get_var($this->tokenValue, $this->tokenValueKey);
        $tmp = @shm_put_var($this->tokenValue, $this->tokenValueKey, false);
//        $tmp = @shm_get_var($this->tokenValue, $this->tokenValueKey);
        @sem_release($this->tokenSemaphore);
    }

    private function LOCK() {

        for ($triesLeft = 5; $triesLeft > 0; $triesLeft--) {

            if($this->try_lock()) {
                return true;
            }

            sleep(1);
        }

        return false;
    }
}


/** fonctions_cache.php **/

trait FUNCTIONS_CACHE {

    // create a name like this : cache
    public function make_name($address, $tmp_is_tab) {

        if(empty($tmp_is_tab)) {
            $tmp_is_tab ="0";
        }

        $address=preg_replace('{%2C}',',',$address); // index.php
        $address=preg_replace('{,SANS}','',$address); // index.php
        $address=preg_replace('{^\/index\.php}','/',$address); // index.php
        $address=preg_replace('{\.php$}','.html',$address); // index.php
        $address=preg_replace('{\/}','-',$address); // URI 2 filename
        $address=preg_replace('{,}','-',$address); // URI 2 filename
        $address='-' . $address; // URI 2 filename
        $address=$tmp_is_tab . $address; // URI 2 filename
        $address=preg_replace('{[-]+}','-',$address); // URI 2 filename
        if($address=="--") $address="0-index.html"; // if url=/ rewrite in index.html
        if($address=="0-") $address="0-index.html"; // if url=/ rewrite in index.html
        if($address=="1-") $address="1-index.html"; // if url=/ rewrite in index.html

        return $address;
    }
}


require_once(__DIR__ . "/fonctions_cache.php");

class HTML_CACHE {

    use FUNCTIONS_CACHE;

    private static $_instance; // L'attribut qui stockera l'instance unique

    private $LOCK            = null;

    private $timeCreated        = null;

    private $nonce            = null;
    private $nonce_file        = null;

    private $to_be_changed        = null;
    private $cache_exists        = null;
    private $nonce_file_exists    = null;

    private    $cache_dir        = null;
    private $cache_base        = "/var/www/html/cache/";  //   '/mon/repertoire/physique/de/cache/'; // base path with / ending
    private    $cache_file        = null;

    private $log_file        = "log.txt"; // append will be done with $cache_base
    private $log_activated        = false;
    private $cache_activated    = false;

    private $display                        = '';

    private $is_mobile        = null;

    private $is_post        = null;

    private $urlweb            = null;

    private $note            = null;

    private $previous_note        = null;

    const MIN_FILESIZE        = 10000;

    const CSP_CHROME        = 0;
    const CSP_SAFARI        = 1;
    const CSP_IE            = 2;

    const CSP_TO_REPORT        = 3;

    const CSP_CONTROL_ACCESS    = 4;

    const LOG_FILE            = __DIR__ . "/log_cache_file.txt";

    private $fp_log            = null;

    //singleton detector  
    public static function getInstance($planning="daily",$is_tab="0", $PARAM=null) {

        if (is_null(self::$_instance)) {
            self::$_instance = new self($planning, $is_tab, $PARAM);
        }
        return self::$_instance;
    }

    public function save()
    {
        $this->destroy();
    }

    private function __construct($planning,$is_tab, $PARAM) {

        ob_start();
       
//        touch(self::LOG_FILE);

//        $this->fp_log = @fopen(self::LOG_FILE, "a");

        $schedules = array( "minute"=>60 , "hourly" => 3600, "daily" => 3600,"weekly" => 3600*24*7, "monthly" => 3600*24*30, "yearly" => 3600*24*365 ); // list of expiration time

        // "daily" => 45mn
        $expire = (int)$schedules[$planning]; // get expiration time

        if((!$is_tab)||($is_tab == "0"))
        {
            $tmp_is_tab = "0";
        }
        else
        {
            $tmp_is_tab = "1";
        }

        $this->is_mobile = $tmp_is_tab;

        $this->to_be_changed    = false;
        $this->cache_exists    = false;

        $this->is_post        = false;

        /*************************/
        /**     SUFFIXE FICHIER        **/
        /**                    CACHE                **/
        /*************************/
        $requested_url=$this->make_name(urldecode($_SERVER['REQUEST_URI']), $tmp_is_tab); //make page addresse

        /*************************/
        /** SUFFIXE FICHIER    **/
        /**CLIENT DES NONCES    **/
        /*************************/
        $this->cache_dir=$this->cache_base.$planning;

        $this->cache_file=$this->cache_dir."/". $requested_url; // build full cache file path

        $this->previous_note = (isset($_SESSION[$requested_url])) ? (int)$_SESSION[$requested_url] : 0;

        $_SESSION[$requested_url] = 0;

//        fputs($this->fp_log, "\t\t" . '$previous_note = ' . $this->previous_note . "\t\t" . '$note = ' . $this->note . "\n");

//        @fclose($this->fp_log);

        if($this->previous_note > 0) {

            $this->is_post    = true;

            $this->to_be_changed = true;

            @unlink($this->cache_file);

            return $this;
        }

        if(isset($PARAM) && $PARAM == "SANS") {

            $this->to_be_changed = true;

            @unlink($this->cache_file);

            return $this;
        }

        clearstatcache($this->cache_file, true);

        $this->cache_exists         = file_exists($this->cache_file);

        $this->timeCreated         = (int)time() -  $expire - 600;

        if(($this->cache_exists) &&
            (filesize($this->cache_file) < self::MIN_FILESIZE)) {

            $this->cache_exists = false;
        }

        if($this->cache_exists) {

            if(($fd = @fopen($this->cache_file, "r")) !== false) {

                $this->timeCreated = (int)preg_replace("{[\r\n]+}", "", @fgets($fd));

                @fclose($fd);
            }
        }

        $to_update = ((time() - $this->timeCreated) > $expire);

        //        fputs($this->fp_log, "\t\t" . implode("\n", $this->recent_array_lines) . "\n");

        if(!$_POST)
        {
            $this->is_post = false;

            $this->cache_activated = ($this->cache_exists === false ) || $to_update || (isset($_GET['reload'])); //if not exist or expired or forced

            if ($this->cache_activated) {

                $this->LOCK = new Semaphore_non_blocking(md5($this->cache_file), true);

                clearstatcache($this->cache_file, true);

                $this->cache_exists = file_exists($this->cache_file);

                if(($this->cache_exists) &&
                    (filesize($this->cache_file) < self::MIN_FILESIZE))
                {
                    $this->cache_exists = false;
                }

                $this->cache_activated = ($this->cache_exists == false ) || $to_update || (isset($_GET['reload'])); //if not exist or expired or forced

                if ($this->cache_activated) {

                    $this->logging("cache started for file ".$this->cache_file."($planning)", "start");

                } else { // file exist

                    $tmp_nonce = $this->RandomToken();

                    $this->setNonce($tmp_nonce);

                    $this->display = $this->lecture();

                    $this->display = str_replace('%CSP_NONCE%', $tmp_nonce, $this->display);

                    $this->headerStrictCSP();

                    echo $this->display;

                    ob_end_flush();// end buffer

                    unset($this->LOCK);
                   
                    exit;
                }
            } else { // file exist

                $tmp_nonce = $this->RandomToken();

                $this->setNonce($tmp_nonce);

                $this->display = $this->lecture();

                $this->display = str_replace('%CSP_NONCE%', $tmp_nonce, $this->display);

                $this->headerStrictCSP();

                echo $this->display;

                ob_end_flush();// end buffer

                unset($this->LOCK);

                exit;
            }
        }
        else
        {
            $this->is_post=true;
        }

        return $this;
    }

    private function RandomToken($length = 32){

        return base64_encode(random_bytes(24));

        if(!isset($length) || intval($length) <= 8 ){
            $length = 32;
        }
        $length = ($length + ($length % 2)) / 2;

        if (function_exists('random_bytes')) {
            return bin2hex(random_bytes($length));
        }

        $bytes = '';
        while (strlen($bytes) < $length) {
            $bytes .= chr(mt_rand(0, 255));
        }
        return bin2hex($bytes);
    }

    private function headerStrictCSP() {

        $array_csp = array();
        $array_csp = $this->generateStrictCSP(false);

        //        print_r($array_csp);

        //        echo "<br>";

        /**
        if(isset($array_csp[self::CSP_CONTROL_ACCESS])) {

            header($array_csp[self::CSP_CONTROL_ACCESS][0] . ': ' . $array_csp[self::CSP_CONTROL_ACCESS][1]);
        }
        **/

        if(isset($array_csp[self::CSP_TO_REPORT])) {

            header($array_csp[self::CSP_TO_REPORT][0] . ': ' . $array_csp[self::CSP_TO_REPORT][1]);
        }

        if(isset($array_csp[self::CSP_CHROME])) {

            header($array_csp[self::CSP_CHROME][0] . ': ' . $array_csp[self::CSP_CHROME][1]);
        }

//        return;

        if(isset($array_csp[self::CSP_SAFARI])) {

            header($array_csp[self::CSP_SAFARI][0] . ': ' . $array_csp[self::CSP_SAFARI][1]);
        }

        if(isset($array_csp[self::CSP_IE])) {

            header($array_csp[self::CSP_IE][0] .': ' . $array_csp[self::CSP_IE][1]);
        }
    }

    private function generateStrictCSP($not_trial = true) {

        $tmp_nonce = $this->getNonce();

        $array_csp = array();

//        $array_csp[self::CSP_CONTROL_ACCESS] = array("Access-Control-Allow-Origin", "*");

        $array_csp[self::CSP_TO_REPORT] = array("Report-To", "{ \"group\": \"endpoint\", \"max_age\": 10886400, \"endpoints\": [{ \"url\": \"https://www.pronostics-courses.fr/csp_report/uri_report.php\"}]}");

//        $csp = "default-src 'self'; script-src 'self' 'unsafe-inline' 'nonce-" . $tmp_nonce . "' https: https://choices.consentframework.com; connect-src 'self' https://analytics.pronostics-courses.fr https://choices.consentframework.com https://*.sddan.com https://abs.proxystore.com https://fr-gmtdmp.mookie1.com https://dmp.adform.net https://js.cookieless-data.com; style-src 'self' 'unsafe-inline' https://analytics.pronostics-courses.fr https://choices.consentframework.com https://*.sddan.com https://abs.proxystore.com https://fr-gmtdmp.mookie1.com https://dmp.adform.net https://js.cookieless-data.com; img-src 'self' https://analytics.pronostics-courses.fr https://choices.consentframework.com https://*.sddan.com https://abs.proxystore.com https://fr-gmtdmp.mookie1.com https://dmp.adform.net https://js.cookieless-data.com data:; frame-src 'self' 'unsafe-inline' https://analytics.pronostics-courses.fr https://choices.consentframework.com https://*.sddan.com https://abs.proxystore.com https://fr-gmtdmp.mookie1.com https://dmp.adform.net https://js.cookieless-data.com; frame-ancestors 'self' https://analytics.pronostics-courses.fr https://choices.consentframework.com https://*.sddan.com https://abs.proxystore.com https://fr-gmtdmp.mookie1.com https://dmp.adform.net https://js.cookieless-data.com; object-src 'none'; base-uri 'none'; report-uri https://www.pronostics-courses.fr/csp_report/uri_report.php; report-to endpoint;";

        $csp = "object-src 'none'; script-src 'nonce-" . $tmp_nonce . "' 'unsafe-inline' 'unsafe-eval' 'strict-dynamic'; base-uri 'none'; report-uri https://www.pronostics-courses.fr/csp_report/uri_report.php; report-to endpoint;";

        // header("X-Content-Security-Policy"    => Safari

        // header("X-WebKit-CSP"        => IE

        if($not_trial === true) {

            $array_csp[self::CSP_CHROME] = array("Content-Security-Policy", $csp);
        } else {

            $array_csp[self::CSP_CHROME] = array("Content-Security-Policy-Report-Only", $csp);
        }

//        $array_csp[self::CSP_SAFARI]    = array("X-WebKit-CSP", $csp);

        $array_csp[self::CSP_IE]    = array("X-Content-Security-Policy", $csp);

        return $array_csp;

    }

    private function getNonce() {

        return $this->nonce;
    }

    private function setNonce($nonce) {

        $this->nonce = $nonce;
    }

    private function lecture() {

        $list_enregs = file_get_contents($this->cache_file);

        $list_enregs = preg_replace("{^[\r\n]+}", "", $list_enregs);
        $list_enregs = preg_replace("{\r\n}", "\n", $list_enregs);

        if(preg_match("{^(\d+)\n}", $list_enregs, $output) == 1) {

            $this->timeCreated = (int)$output[1];

            //            fputs($this->fp_log, "\t\t" . '$this->timeCreated = ' . $this->timeCreated . "\n");

            $pos = strpos($list_enregs, "\n");

            $str_lecture = substr($list_enregs, $pos + 1);

            $str_lecture = preg_replace("{[\r\n]+$}", "\n", $str_lecture);

        } else {

            $str_lecture = false;
        }

        return $str_lecture;
    }

    function ecriture($contenuCache)
    {
        $regex = "{(<script.+nonce[\t[*=[ \t]*\")([^\"]+)(\")}";

        $replacement = "$1%CSP_NONCE%$3";

        $file = preg_replace("{^[\r\n]+}", "", $contenuCache);

        $file = preg_replace("{\r\n}", "\n", $file);

        $tmp_array = array();
        $tmp_array = preg_split("{\n}", $file);

        $content = "";

        foreach($tmp_array as $line) {

            $content .= preg_replace($regex, $replacement, $line) . "\n";
        }

        $this->timeCreated = time();

        $list_enregs    = $this->timeCreated . "\n" . $content;

        $list_enregs    = preg_replace("{[\r\n]+$}", "\n", $list_enregs);

        return file_put_contents($this->cache_file, $list_enregs);
    }

    // create a name like this : cache
    function id_uri($address) {

        $address=preg_replace('{%2C}',',',$address); // index.php
        $address=preg_replace('{,SANS}','',$address); // index.php
        $address=preg_replace('{^\/index\.php}','/',$address); // index.php
        $address=preg_replace('{\.php$}','.html',$address); // index.php
        $address=preg_replace('{\/}','-',$address); // URI 2 filename
        $address=preg_replace('{,}','-',$address); // URI 2 filename

        $id = md5($address);

        return $id;
    }

    private function weburl() {

        if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on')
            $url = "https";
        else
            $url = "http";

        // Ajoutez // à l'URL.
        $url .= "://";

        // Ajoutez l'hôte (nom de domaine, ip) à l'URL.
        $url .= $_SERVER['HTTP_HOST'];

        // Ajouter l'emplacement de la ressource demandée à l'URL
        $url .= $_SERVER['REQUEST_URI'];

        // Afficher l'URL
        return $url;
    }

    // log event used like this -> argument : Message , [Group]
    // write string 18/01/2011 11:45:16 -> MYSQL: SELECT * FROM table
    function logging($msg, $group="DEFAULT")
    {
        if($this->log_activated) {
            // upper case
            $group=strtoupper ($group);
            // prepare message
            $msg= str_replace("\n"," ",$msg);
            $msg= str_replace("\r"," ",$msg);
            // open file
            $fd = fopen($this->cache_base.$this->log_file, "a+");
            // write string 18/01/2011 11:45:16 -> MYSQL: SELECT * FROM table
            fwrite($fd, date("d/m/Y H:i:s")." -> ". $group. ": ".$msg . "\n");
            // close file
            fclose($fd);
        }
    }

    function clear_cache($planning="daily") {
        $this->logging("$planning called", "clear_dir");
        if (is_dir($this->cache_base.$planning)) $this->del_tree($this->cache_base.$planning);
        die ($planning." cache cleared !");
    }

    function del_tree($dir)
    {
        $current_dir = opendir($dir);
        while($entryname = readdir($current_dir)) {
            if(is_dir("$dir/$entryname") and ($entryname != "." and $entryname!=".."))
            {
                del_tree("$dir/$entryname");
            }  elseif($entryname != "." and $entryname!="..") {
                unlink("$dir/$entryname");
            }
        }
        closedir($current_dir);
        rmdir($dir);
        clearstatcache();
        $this->logging("remove dir $dir", "clear_dir");

    }

    function del_file($file)
    {
        $file="cache".$file;
        $this->logging("$file called", "clear_file");
        $current_dir = opendir($this->cache_dir);
        while($entryname = readdir($current_dir)) {
            if(is_dir($this->cache_dir."/".$entryname) and ($entryname != "." and $entryname!=".."))
            {
                $current_dir2 = opendir($this->cache_dir."/".$entryname);
                while($entryname2 = readdir($current_dir2)) {
                    if(is_file($this->cache_dir ."/". $entryname."/".$entryname2) and $entryname2 == $file ) {
                        unlink($this->cache_dir."/".$entryname."/".$entryname2);
                        $this->logging("remove file ".$this->cache_base."/$entryname/".$entryname2, "clear_file");
                    }
                }
                closedir($current_dir2);
            }
        }
        closedir($current_dir);
        clearstatcache();
        die ($file." cache cleared !");
    }

    // small function to protect from script attack or SQL injections
    function escape_string($uvar){
        $uvar=preg_replace("/((\%3C)|<)[^\n]+((\%3E)|>)/","",$uvar); // Prevent script CSS attack
        return mysql_escape_string($uvar); // prevent mysql attack
    }

    public function destroy() {

        if($this->is_post == false && $this->cache_activated) {

            if (!is_dir($this->cache_dir)) {
                mkdir($this->cache_dir); // create dir if needed
                $this->logging($this->cache_dir, "create_dir");
            }
        }

        if($this->to_be_changed    == true) {

            $tmp_nonce = $this->RandomToken();

            $this->setNonce($tmp_nonce);

            $this->display = ob_get_contents();

            ob_get_clean();

            ob_start();

            $this->ecriture($this->display); // Write cache file

            $this->display = $this->lecture();

            $this->display = str_replace('%CSP_NONCE%', $tmp_nonce, $this->display);

            $this->headerStrictCSP();

            echo $this->display;

//            header("HTTP/1.1 200 OK");

            ob_end_flush();// end buffer

//            @fclose($this->fp_log);

            unset($this->LOCK);

            exit;
        }

        if($this->is_post == false && $this->cache_activated) {

            $tmp_nonce = $this->RandomToken();

            $this->setNonce($tmp_nonce);

            $this->display = ob_get_contents();

            ob_get_clean();

            ob_start();

            $this->ecriture($this->display); // Write cache file

//            fputs($this->fp_log, "\t\tNonce Ecriture Creation = " . $tmp_nonce . "\n");

            $this->display = $this->lecture();

            $this->display = str_replace('%CSP_NONCE%', $tmp_nonce, $this->display);

//            @fclose($this->fp_log);

            $this->headerStrictCSP();

            echo $this->display;

            /**
            print_r(headers_list());

            echo "<br>\n";
            **/

            ob_end_flush();// end buffer

            unset($this->LOCK);

            exit;
        }
    }
}

/** Instanciation **/
$handle_cache = HTML_CACHE::getInstance("daily", $this->is_tab, null);


Plus d'info sur demande.
 
Dernière édition:
Discussions similaires
Haut