Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compressing and caching CSS with PHP

I am currently trying to achieve a compression method for my CSS files. I am basically copying the same way I do it for my JS files, but it is not working. I checked with Firebug tool, but there is no CSS being loaded.

How can I call the css.php which will then call the compressed CSS files?

Working code with JS, the file is scripts.php (I did not specify the .js extension):

<script type="text/javascript" src="js/scripts.php?build=123&load=foo,bar"></script>

I wanted to do the same for my CSS files:

<link href="styles/css.php?build=123&load=foo,bar/jquery-ui-1.8rc2.custom" type="text/css">

The css.php is supposed to do the compression:

<?php
error_reporting(E_ERROR);
// see http://web.archive.org/web/20071211140719/http://www.w3.org/2005/MWI/BPWG/techs/CachingWithPhp
// $lastModifiedDate must be a GMT Unix Timestamp
// You can use gmmktime(...) to get such a timestamp
// getlastmod() also provides this kind of timestamp for the last
// modification date of the PHP file itself

function cacheHeaders($lastModifiedDate) {
    if ($lastModifiedDate) {
        if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $lastModifiedDate) {
            if (php_sapi_name()=='CGI') {
                Header("Status: 304 Not Modified");
            } else {
                Header("HTTP/1.0 304 Not Modified");
            }
            exit;
        } else {
            $gmtDate = gmdate("D, d M Y H:i:s \G\M\T",$lastModifiedDate);
            header('Last-Modified: '.$gmtDate);
        }
    }
}

// This function uses a static variable to track the most recent
// last modification time
function lastModificationTime($time=0) {
    static $last_mod ;
    if (!isset($last_mod) || $time > $last_mod) {
        $last_mod = $time ;
    }
    return $last_mod ;
}

lastModificationTime(filemtime(__FILE__));
cacheHeaders(lastModificationTime());
header("Content-type: text/css; charset: UTF-8");

ob_start ("ob_gzhandler");

foreach (explode(",", $_GET['load']) as $value) {
    if (is_file("$value.css")) {
        $real_path = mb_strtolower(realpath("$value.css"));
        if (strpos($real_path, mb_strtolower(dirname(__FILE__))) !== false ||strpos($real_path, mb_strtolower(dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR.'modules'.DIRECTORY_SEPARATOR)) !== false) {
            lastModificationTime(filemtime("$value.css"));
            include("$value.css"); echo "\n";
        } 
    }
}
?>
like image 387
CodingWonders90 Avatar asked Aug 06 '12 19:08

CodingWonders90


2 Answers

You are missing the rel="stylesheet" attribute from your <link> tag. Apart from that, the code looks okay.

You might also wish to look at the question and answer here.

like image 130
Whisperity Avatar answered Oct 15 '22 21:10

Whisperity


Try minify. This class compress and cache js and css.

like image 40
w.matyskiewicz Avatar answered Oct 15 '22 22:10

w.matyskiewicz