Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [Gzip] gzencode class uso consiglio .....

    Ciao.
    Secondo voi questo è un uso
    appropriato di compressione dell'ouput:
    Gzip class:
    Codice PHP:
    <?php
    class Gzip{
        private 
    $fileName'';
        public function 
    __construct($fileName){
           if(!
    file_exists($fileName)){
                throw new 
    FileException('File ['.$fileName.'] not found in ['.__CLASS__.']');
            }
            
    $this->fileName$fileName;
        }
        public function 
    gZipOutput(){
            
    // check if browser supports gzip encoding
            
    if(strstr($_SERVER['HTTP_ACCEPT_ENCODING'],'gzip')){
                
    // start output buffer
                
    ob_start();
                
    // include file into output buffer
                   
    include($this->fileName);
                
    // compress data with gzip
                
    $output=gzencode(ob_get_contents(),9);
                
    // clean up output buffer
                
    ob_end_clean();
                
    header('Content-Encoding: gzip');
                echo 
    $output;
            }
            else{
                include(
    $this->fileName);
            }
         }
    }
    ?>
    Gz.php
    Codice PHP:
    <?php
    // Per esempio
    $obj= new MyClass();
    //recupero l'ouput 
    $output$obj->display();
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title>Untitled Document</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <body>
    <?php echo $output?>
    </body>
    </html>
    ?>
    index.php
    Codice PHP:
    <?php
    $root 
    realpath(dirname(__FILE__));
    $root str_replace('\\''/'$root);
    require_once(
    $root."/classes/class.Exception.php");
    require_once(
    $root."/classes/class.Gzip.php");
    try {
        
    $gzip= new Gzip($root.'/gz.php');
        
    $gzip->gZipOutput();
        unset(
    $gzip);
    }
    catch (
    FileException $e) {
        echo 
    $e;
        
    error_log($e->getMessage()."\n"3$root."/log/error.log");
        exit();
    }
    ?>
    Praticamente in gz.php ho la pagina
    index non compressa che includo
    per la compressione in index.php
    se il browser accetta dati compressi
    se no mostro la pagina senza compressione.


    Aspetto consigli


    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  2. #2

    .......

    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  3. #3
    // check if browser supports gzip encoding
    if(strstr($_SERVER['HTTP_ACCEPT_ENCODING'],'gzip')){
    // start output buffer


    A me sembra che questo controlli se il "server" supporta l'encoding gzip.....

    Sbaglio?

  4. #4
    Vorrei implementare un sistema di cache statica da applicare a progetti php come cms etc..

    Il principio di funzionamento dovrebbe essere, in pseudo codice:

    Codice PHP:
    Valuto la richiesta http 
     
    (1)se il contenuto relativo è un contenuto già nella cache statica
                      restituisco una pagina html statica 
    (2)
                      exit
          
            else
                      
    elaboro la richiesta e produco una pagina dinamica
                                se la pagina deve essere 
    "staticizzata"
                                              
    ne intercetto l'output
                                              lo scrivo in un file statico per richiamarlo in succ. richieste(3) 
    Come base dei controlli dovrebbe essere questo, dove:

    1) Trovare un modo veloce per ridurre chiamate a db ed elaborazioni complicate, ora uso file_exists specificando nome del file etc. Domanda: è corretto cercare nel filesystem? C'è qualcosa di + veloce, soprattutto all'aumentare delle pagine statiche???

    2)Vorrei restituire una pagina + possibile leggera, l'ideale è che fosse leggera anche sul FS
    Infatti al punto successivo la comprimo con gzencode prima di scriverla

    3) Sul server che utilizzo non c'è traccia di 'HTTP_ACCEPT_ENCODING' ma le zlib sono abilitate.... da prove che ho fatto non riesco a mandare la pagina compressa al browser pena una serie di caratteri incomprensibili. In locale con 'HTTP_ACCEPT_ENCODING' gzip,deflate riesco a salvare e rimandare file compressi con l'estensione .gz

    Mi sembri un phpista + esperto di me... cosa ne pernsi? Consigli...

  5. #5

    ..........

    Ciao.
    Questo è un semplice esempio di caching:
    Codice PHP:
    function writeCache($data,$cacheFile='default_cache.txt')
        if(!
    $fp=fopen($cacheFile,'w')){
             
    trigger_error('Error opening cache file');
             exit();
        }
        if(!
    flock($fp,LOCK_EX)){
            
    trigger_error('Unable to lock file');
            exit();
        }
        if(!
    fwrite($fp,serialize($data))){
            
    trigger_error('Error writing to cache file');
            exit();
        }
        
    flock($fp,LOCK_UN);
        
    fclose($fp);
    }
    function 
    readCache($cacheFile){
         if(!
    file_exists($cacheFile)){
             
    trigger_error('Invalid cache file');
             exit();
         }
         return 
    unserialize(file_get_contents($cacheFile));
    }
    function 
    connectMySQL($host,$user,$password,$database){
        if(!
    $db=mysql_connect($host,$user,$password)){
             
    trigger_error('Error connecting to the server '.mysql_error());
             exit();
        }
        if(!
    mysql_select_db($database,$db)){
            
    trigger_error('Error selecting database '.mysql_error());
            exit();
        }
    }
    function 
    query($query){
        if(!
    $result=mysql_query($query)){
            
    trigger_error('Error performing query '.$query.mysql_error());
            exit();
        }
        return 
    $result;

    }
    // define cache file
    $cacheFile='cacheFile.txt';
    // define expire time in seconds (2 hours)
    $expireTime=7200;
    // check to see if cache file is valid (time triggered caching)
    if(file_exists($cacheFile)&&filemtime($cacheFile)>(time()-$expireTime)){
        
    // read data from cache file
        
    $data=readCache($cacheFile);
    }
    else{
        
    // read data from MySQL
        
    connectMySQL('host','user','password','databasename');
        
    $result=query('SELECT * FROM users');
        
    // store result set in array
        
    while($row=mysql_fetch_array($result,MYSQL_ASSOC)){
             
    $data[]=$row;
        }
        
    // store serialized data in cache file
        
    writeCache($data,$cacheFile);
    }
    // display data
    foreach($data as $key=>$row){
        echo 
    'First Name :'.$row['firstname'].' Last Name :'.$row['lastname'].'
    '
    ;

    La spiegazione la puoi trovare qui

    Ad occhio nel post non hai molto le idee chiare.

    Ti faccio il mio esempio prima di arrivare alla compressione
    (in cui per la verità sono ben poco ferrato dando un occhio
    in giro ho trovato pareri contrastanti manuel Lemos di phpclasses.org
    ad esempio suggerisce di usare un utiliti per Apache)

    Recupero i dati da Db o xml o file
    li serializzo con una classe per il caching
    con questi faccio la paginazione con un altra classe
    creo l'output e poi lo comprimo prima di spedirlo
    al browser.


    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  6. #6
    La mia situazione/obbiettivi sono forse un po' diversi, provo a spiegarti magari puoi darmi una mano:

    Voglio implementare uno script che mi permetta di creare una cache staticaper i contenuti di un cms, la voglio per determinate pagine.
    Obbiettivo è velocizzare la navigazione sul sito escludendo, per pagine dove non è strettamente necessario, l'elaborazione complessa di uno script che interroga db richiama template etc.

    Sono ad un buon punto (con qualche problema e qualche domanda)

    Prima dell'elaborazione da parte del cms intercetto la richiesta http e controllo se c'è il "relativo" file statico, questo controllo sarebbe l'unico per pagine nella cache e quindi penso molto veloce:

    Codice PHP:
    // controllo se esiste la pagina relativa nella cache e se è accettata la codifica
    //$cachefile è l'md5 di $_SERVER['REQUEST_URI'] più l'estensione
     
    if ((@file_exists($cachefile)) && (strpos($_SERVER['HTTP_ACCEPT_ENCODING'],'gzip') !== false)) {
                
    //header ("Content-Type: text/html");
                
    header ("Content-Encoding: gzip");
                @
    readfile($cachefile);
                exit();
                
    //interrompo lo script

     
    }
    // lo script prosegue con la generazione dinamica del contenuto da parte del cms 

    A fine script (mi troverò in questa situazione per richieste elaborate per file non ancora in cache) controllo se quella determinata url è tra quelle che voglio far diventare files statici:

    Codice PHP:
    //il metodo di questa classe restituisce 1 se la url è tra quelle che voglio mettere in cache

    if ($database->loadResult() == '1'){
                  
                  
                  
    // genero il file di cache  
                  
    $fp = @fopen($cachefile'w');    
                  
    // salvo il contenuto della pagina nel file di cache 
                  // lo script del cms in questo momento a prodotto un buffer del contenuto
                  
    $pageoutput =  ob_get_contents() . "\n";
          
                  
    ////gz se supportato
                  
    $data gzencode($pageoutput9);
                  
    //// non gz
                  //// $data = $pageoutput;
                  
    fwrite($fp$data);
                  
    fclose($fp);
                  
            } 
    La sostanza dello script è questa... però:

    Va bene usare file_exist per cercare nel filesystem o c'è un metodo più efficace?

    Lo script è ok o migliorabile?

    Grazie per qualsiasi contributo...

  7. #7

    ........

    (strpos($_SERVER['HTTP_ACCEPT_ENCODING'],'gzip') !== false)
    E' sbagliato (anche se funziona)
    devi fare una cosa del genere come dice il manuale
    if(strpos($_SERVER['HTTP_ACCEPT_ENCODING'],'gzip') === false){
    NON SUPPORTA GZIP
    }
    else{
    SUPPORTA
    }



    if ((@file_exists($cachefile)) && (strpos($_SERVER['HTTP_ACCEPT_ENCODING'],'gzip') !== false)) {
    //header ("Content-Type: text/html");
    header ("Content-Encoding: gzip");
    @readfile($cachefile);
    exit();
    //interrompo lo script

    }
    // lo script prosegue con la generazione dinamica del contenuto da parte del cms

    HAI MESSO L'EXIT e per di + hai header ("Content-Encoding: gzip");
    Poi tua logica (che non si capisce che caspita vuoi combinare
    o almeno io non lo capisco) a parte quando usi @ devi comunque sempre
    controllare il risultato (cosa ti ritorna la funzione)
    una cosa del tipo:

    if(!file_exists($cacheFile)){
    trigger_error('Invalid cache file');
    exit();
    }


    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  8. #8
    Cosa intendi con "è sbagliato anche se funziona"???

    Il voglio controllare se esiste il file di cache per la pagina che si sta elaborando e se l'invio del file gzip è supportato dal server,quindi:

    if ((file_exists($cachefile)) && (strpos($_SERVER['HTTP_ACCEPT_ENCODING'],'gzip') !== false))

    il simbolo @ l'ho tolto.. hai perfettamente ragione non vuol dire niente messo li.....
    E' proprio per questo genere di errori che volevo fargli dare un'occhiata a chi più esperto.

    Forse non capisci cosa vuol fare il mio script perché mi sono spiegato male, ho un file index.php che intercetta tutte le richieste al sito ... fa le sue elaborazioni ... anche decine di query sql... poi con un template engine produce un output html, insomma quello che fanno molti CMS (quello su cui sto facendo i miei esperimenti ora è joomla). Il mio script si inserisce all'inizio per restituire una pagina segià nella cache... e alla fine per scrivere quella pagina nella cache se previsto.

    Quindi non mi serve l'else perché in caso di file di cache non esistente è corretto che lo script prosegua e produca la pagina dinamica....
    Alla fine dello script aggiungo la mia parte nella quale controllo se voglio mettere in cache la pagina corrente, se si lo faccio e alla prossima richiesta per quella pagina file_exist non sarà più false, se no ... nulla

    Ciao

  9. #9

    ............

    Cosa intendi con "è sbagliato anche se funziona"???
    This function may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE, such as 0 or "". Please read the section on Booleans for more information. Use the === operator for testing the return value of this function.
    Quella notazione ha senso usarla
    solamente nell'esempio del manuale.

    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.