Ergebnis 1 bis 2 von 2

Thema: CSS uns JavaScript cachen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer1699
    Gast

    CSS uns JavaScript cachen

    So, da hier ja so viel von Cache in der letzten Zeit geredet wird, gebe ich euch auch gerne mal einen meiner Codes ab *g*
    Vielleicht gibt es ja Verbesserungsvorschläge.

    Vorraussetzung:
    - CSS/Js Dateien in seperater Datei mit der Endung .css oder .js
    - Der Ordner mit den beinhaltenden Datein ist schreibbar für Web-Server/PHP
    - mod_rewrite
    - PHP ab 5.2

    Code:
    Vorhandene .htaccess - Datei erweitern oder diese hochladen mit folgendem Inhalt:
    
    RewriteEngine On
    RewriteBase /
    RewriteRule ^(.*)\.((js|css))$ gzip_js_css.php?file=$1&filetype=$2 [L]
    
    Die Datei *.php in das Hauptverzeichnis kopieren.
    
    
    Fertig!
    
    Von nun an werden *.js und *.css Dateien - sofern vom Client unterstüzt - 
    komprimiert und mit Cache-Headern übertragen.
    
    Um nicht bei jeder Anfrage die Datei neu zu komprimieren, wird diese zwischengespeichert.
    Dazu muss darauf geachtet werden, dass das Verzeichnis mit der *.js / *.css beschreibbar ist.
    Code:
    .htaccess:
    RewriteEngine On
    RewriteBase /
    RewriteRule ^(.*)\.((js|css))$ gzip_js_css.php?file=$1&filetype=$2 [L]
    PHP-Code:
    gzip_js_css.php :
    <?php
    if(isset($_GET['filetype']) && isset($_GET['file']) && $_SERVER['REQUEST_METHOD'] == 'GET')
    {
        
    define("REFRESH""3 day");
        
    define("COMPRESS_LEVEL"6);
        
    define("RECACHE"1);
        
    $filetype $_GET['filetype'];
          
    $filename getcwd().'/'.$_GET['file'].'.'.$filetype;
          
            
    /**
            * 15.03.2008 01:01:45
            * @author Michael Wegener, HttpCaching Class from the Net
            * purpose: deliver .css and .js in compressed form
            * 
            */
            
    class HttpCaching {
              private 
    $cacheControlDirectives = array();
              private 
    $ages = array('max-age' => -1's-maxage' => -1);
              private 
    $lastModified;
              private 
    $eTag;
              function 
    sendStatusAndHeaders($die) {
                
    $isFresh $_SERVER['REQUEST_METHOD'] == "GET" $this->isFresh() : false;
                
    // Send back a 304?
                
    if ($isFresh == true) {
                  
    header('HTTP/1.1 304 Not Modified');
                }
                
    $this->sendHeaders();
                
    // Die if 304?
                
    if ($isFresh == true && $die == true) {
                  exit();
                }
                return 
    $isFresh;
              }
              function 
    sendHeaders() {
                
    // Expires corresponds to max-age
                
    if ($this->ages['max-age'] >= 0) {
                  
    header('Expires: ' self::formatDate(time() + $this->ages['max-age']), 1);
                }
                
    // Cache-Control
                
    if (!is_array($this->cacheControlDirectives)) {
                  
    $this->cacheControlDirectives = array();
                }
                foreach(
    $this->ages as $dir => $value) {
                  if (
    $value >= 0) {
                    
    array_push($this->cacheControlDirectives"$dir=$value");
                  }
                }
                if (
    count($this->cacheControlDirectives) > 0) {
                  
    header('Cache-Control: ' .
                         
    implode(', '$this->cacheControlDirectives), 1);
                }
                
    // At least one of ETags of Last-Modified will be sent for cacheability
                
    if ($this->eTag) {
                  
    header('ETag: ' $this->eTag);
                }
                if (
    $this->lastModified) {
                  
    $lm $this->lastModified;
                } else if (!
    $this->eTag) {
                  
    $lm time();
                }
                if (
    $lm) {
                  
    header('Last-Modified: ' self::formatDate($lm));
                }
              }
              function 
    isFresh() {
                if (!isset(
    $_SERVER['HTTP_IF_MODIFIED_SINCE']) &&
                    !isset(
    $_SERVER['HTTP_IF_NONE_MATCH'])) {
                  
    // No information provided by the client
                  
    return false;
                }
                if (isset(
    $_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
                  if (!
    $this->lastModified) {
                    return 
    false;
                  }
                  
    // Split the If-Modified-Since (Netscape < v6 gets this wrong)
                  
    $ifModifiedSince explode(';'$_SERVER['HTTP_IF_MODIFIED_SINCE']);
                  
    // Turn the client request If-Modified-Since into a timestamp
                  
    $ifModifiedSince strtotime($ifModifiedSince[0]);
                  
    // Compare timestamps (FIXME: make this test '!='?)
                  
    if ($this->lastModified $ifModifiedSince) {
                    return 
    false;
                  }
                }
                if (isset(
    $_SERVER['HTTP_IF_NONE_MATCH'])) {
                  if (
    $_SERVER['HTTP_IF_NONE_MATCH'] == '*') {
                    return 
    true;
                  }
                  if (!
    $this->eTag) {
                    return 
    false;
                  }
                  
    $etags preg_split('/,\s*/'$_SERVER['HTTP_IF_NONE_MATCH']);
                  foreach(
    $etags as $e) {
                    if (
    $this->etagMatch($e)) {
                      return 
    true;
                    }
                  }
                  return 
    false;
                }
                return 
    true;
              }
              function 
    etagMatch($etag) {
                if (!
    $this->eTag) {
                  return 
    false;
                }
                if ((
    self::isEtagWeak($this->eTag) || self::isEtagWeak($etag))
                    &&
                    (
    $_SERVER['REQUEST_METHOD'] != "GET" || isset($_SERVER['HTTP_RANGE'])))
                {
                  
    // Weak validation only works for non-subrange GET requests
                  
    return false;
                }
                if (
    self::etagValidator($this->eTag) == self::etagValidator($etag)) {
                  return 
    true;
                } else {
                  return 
    false;
                }
              }
              static function 
    isEtagWeak($etag) {
                return (
    substr_compare($etag'W/'02) == 0);
              }
              static function 
    etagValidator($etag) {
                if (
    self::isEtagWeak($etag)) {
                  return 
    substr($etag2);
                } else {
                  return 
    $etag;
                }
              }
              function 
    getDuration($type) {
                if (
    $type != "max-age" && $type != "s-maxage") {
                  throw new 
    Exception("Invalid type");
                }
                return 
    $this->ages[$type];
              }
              function 
    setDuration($type$time) {
                if (
    $type != "max-age" && $type != "s-maxage") {
                  throw new 
    Exception("Invalid type");
                }
                if (
    is_numeric($time)) {
                  
    $time intval($time);
                  if (
    $time 0) {
                    
    $time = -1;
                  }
                } else {
                  if (
    $time == 'now') {
                    
    $time 0;
                  } else {
                    
    $time strtotime($time) - time();
                  }
                  if (
    $time 0) {
                    throw new 
    Exception("Bad interval specified to strtotime()");
                  }
                }
                return 
    $this->ages[$type] = $time;
              }
              function 
    freshFor($time) {
                return 
    $this->setDuration('max-age'$time);
              }
              function 
    setCacheControlDirective($type$set) {
                if (
    $set == true) {
                  if (!
    in_array($type$this->cacheControlDirectives)) {
                    
    array_push($this->cacheControlDirectives$type);
                  }
                } else {
                  
    $this->cacheControlDirectives array_diff($this->cacheControlDirectives,
                                                             array(
    $type));
                }
              }
              function 
    ccPublic($set) {
                
    $this->setCacheControlDirective('public'$set);
              }
              function 
    ccNoCache($set) {
                
    $this->setCacheControlDirective('no-cache'$set);
              }
              function 
    ccNoStore($set) {
                
    $this->setCacheControlDirective('no-store'$set);
              }
              function 
    ccMustRevalidate($set) {
                
    $this->setCacheControlDirective('must-revalidate'$set);
              }
              function 
    ccProxyRevalidate($set) {
                
    $this->setCacheControlDirective('proxy-revalidate'$set);
              }
              function 
    etag($value) {
                
    $this->eTag '"' $value '"';
              }
              function 
    weakEtag($value) {
                
    $this->etag($value);
                
    $this->eTag "W/" $this->eTag;
              }
              function 
    lastModified($value) {
                
    $this->lastModified $value;
              }
              function 
    setLastModifiedFromFile($file) {
                
    $finfo stat($file);
                if (!
    $finfo) {
                  return;
                }
                
    $this->lastModified($finfo['mtime']);
              }
              static function 
    sendHeadersSpecifyingFreshness($time) {
                
    $hc = new HttpCaching();
                
    $hc->freshFor($time);
                
    $hc->ccMustRevalidate(true);
                
    $hc->sendHeaders();
              }
              static function 
    formatDate($time) {
                return 
    gmdate("D, d M Y H:i:s"$time) . ' GMT';
              }
            }
                
            
    /**
             * Extends the HttpCaching Class from Michael Wegener
             * thank you for your Class
             *
             * @author Christoph Zysik, ztk
             * @version 0.1
             * 
             */
            
    class ZtkHttpCaching extends HttpCaching 
            
    {
                private 
    $buffering false;
                private 
    $buffertype'';
                private 
    $error_msg;
                private 
    $content_type;
                private 
    $content '';
                private 
    $filetype;
                
                public function 
    setFiletyep($filetype)
                {
                    
    $this->filetype $filetype;
                      switch(
    $this->filetype) {
                        case 
    'js':
                              
    $this->content_type 'application/x-javascript';
                              
    $this->error_msg    "alert('JS not found');";
                          break;
                        case 
    'css':
                              
    $this->content_type 'text/css';
                              
    $this->error_msg    "body { background-color: red; padding:100px; }";
                          break;
                          default:
                              
    $this->content_type 'text/plain';
                              
    $this->error_msg    'non supported extension used';
                          break;
                      }
                      
    Header('Content-type: ' $this->content_type);
                }
                public function 
    setCompression()
                {
                    if (
    stripos($_SERVER["HTTP_ACCEPT_ENCODING"],'x-gzip') !== false) {
                        
    $this->buffering true;
                        
    $this->buffertype='gzencode';
                        
    Header("Content-encoding: x-gzip");
                    }
                    elseif (
    stripos($_SERVER["HTTP_ACCEPT_ENCODING"],'gzip') !== false) {
                        
    $this->buffering true;
                        
    $this->buffertype='gzencode';
                        
    Header("Content-encoding: gzip");
                    }
                    elseif (
    stripos($_SERVER["HTTP_ACCEPT_ENCODING"],'deflate') !== false) {
                        
    $this->buffering true;
                        
    $this->buffertype='gzdeflate';
                        
    Header("Content-encoding: deflate");
                    }
                }
                public function 
    loadFile($file)
                {
                    if( 
    $this->buffering === true)
                    {
                        if (
    $this->buffertype != '' && is_file($file.$this->buffertype) && ((time() - filemtime($file.$this->buffertype))/(3600*RECACHE)) < 1.0) {
                            
    $this->content file_get_contents($file.$this->buffertype);
                        }
                        elseif (
    is_file($file))
                        {
                            
    $this->content file_get_contents($file);
                            
    $this->trimContent();
                            switch (
    $this->buffertype)
                            {
                                case 
    'gzencode':
                                    
    $this->content gzencode($this->contentCOMPRESS_LEVEL);
                                break;
                                case 
    'gzdeflate':
                                    
    $this->content gzdeflate($this->contentCOMPRESS_LEVEL);
                                break;                            
                            }
                            try {
                                
    file_put_contents($file.$this->buffertype$this->content);
                            }
                            catch (
    Exception $e){}
                        }
                        else {
                            echo 
    "/* File: $file not found */\n";
                            echo 
    $this->error_msg;
                            exit;
                        }
                    }
                    
                    if(
    $this->content != '')
                    {
                        
    $this->etag(md5($this->content));
                        return 
    $this->content;
                    }
                    else return 
    $this->error_msg;
                }
                public function 
    sendFile()
                {
                    
    header('Content-Length: ' strlen($this->content));
                    echo 
    $this->content;
                }
                public function 
    trimContent()
                {
                    if (
    $this->filetype == 'css') {                      
                          
    $this->content preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!'''$this->content);
                          
    $this->content str_replace(array("\r\n""\r""\n""\t"), ''$this->content);
                          
    $this->content preg_replace('/\s\s+/'"\n"$this->content);
                    } else {
                          
    $this->content preg_replace('/\ \ +/'" "$this->content);
                    }
                }
            }
                                
    //print ((time() - filectime('css/style.cssgzencode'))/(3600*RECACHE));    
            
    $hc = new ZtkHttpCaching();
            
    $hc->ccMustRevalidate(true);
            
    $hc->setFiletyep($filetype);
            
    $hc->setCompression();
            
    $hc->setLastModifiedFromFile($filename);
            
    $hc->freshFor(constant("REFRESH"));
            
    $hc->loadfile($filename);
            
    $hc->sendStatusAndHeaders(true);
            
    $hc->sendFile();
            
    // if POST
    else die('not supported');
    ?>

  2. #2
    Erfahrener Benutzer Avatar von halk
    Registriert seit
    15.11.2006
    Beiträge
    559
    Hallo


    Ich habe dies mal auf meiner Hp eingesetzt ´,muss sagen klappt ja gut
    am anfang sah sie ja komich aus hatte aber die schreibrechte vergessen nun ist alles im grünen Bereich
    Mfg Halk


Ähnliche Themen

  1. Javascript Programmierer gesucht...
    Von Sam2004 im Forum [HD] Programmieren
    Antworten: 2
    Letzter Beitrag: 27.05.2018, 01:33
  2. [HTML/CSS/JS] Clientseitiger XSS Schutz per JavaScript
    Von Worka im Forum [HD] Programmieren
    Antworten: 2
    Letzter Beitrag: 24.11.2012, 14:58
  3. [HTML/CSS/JS] PHP Funktionen in Javascript
    Von jpwfour im Forum [HD] Programmieren
    Antworten: 1
    Letzter Beitrag: 06.11.2009, 19:49
  4. [HTML/CSS/JS] [JS] Frame mit Javascript cheken
    Von bulli im Forum [HD] Programmieren
    Antworten: 17
    Letzter Beitrag: 11.01.2009, 16:20
  5. [Tutorial] Mediadaten Cachen
    Von Gremlin im Forum [HD] Programmieren
    Antworten: 8
    Letzter Beitrag: 08.06.2008, 02:42

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •