Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Automatically compile LESS files
# LESS compiler
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} ^(.*)\.css
RewriteCond %1.less -f
RewriteRule ^(.*)\.css lessphp/less.php?f=$1.less
<?php
/**
* Automatically compile LESS files
*
* Features:
* - Uses the system temp directory to ensure it is writable
* - Gzip compression
* - Compile only if not modified
* - Respect If-Modified-Since header
* - @todo Add caching for gzipped version
* - @todo Add caching header
*
* Installation:
* 1. Download lessphp and extract to $DOCUMENT_ROOT/lessphp
* @link http://leafo.net/lessphp/
*
* 2. Add this script in the lessphp directory
*
* 3.1. Add RewriteRule in htaccess
* RewriteCond %{REQUEST_FILENAME} !-f
* RewriteCond %{REQUEST_FILENAME} ^(.*)\.css
* RewriteCond %1.less -f
* RewriteRule ^(.*)\.css lessphp/less.php?f=$1.less
*
* 3.2. If htaccess is not possible, replace CSS links from
* /css/style.less
* to
* /lessphp/less.php?f=css/style.less
*
*
* @link https://gist.github.com/4127137
*/
if (empty($_GET['f']) || !preg_match('/\.less$/', $_GET['f'])) {
header('HTTP/1.0 400 Bad Request');
die();
}
$cache_dir = sys_get_temp_dir() . '/lessphp/' . $_SERVER['SERVER_NAME']; // will store files in /tmp/lessphp/example.com/css/style.css
$doc_root = dirname(dirname(__FILE__));
$less_file = "$doc_root/{$_GET['f']}";
$css_file = $cache_dir . '/' . preg_replace('/\.less/', '.css', $_GET['f']);
$enable_gzip = !empty($_SERVER['HTTP_ACCEPT_ENCODING']) && in_array('gzip', explode(',', $_SERVER['HTTP_ACCEPT_ENCODING']));
if (!is_file($less_file)) {
header('HTTP/1.0 404 Not Found');
die();
}
if (!is_dir(dirname($css_file))) {
mkdir(dirname($css_file), 0755, true);
}
require 'lessc.inc.php';
$less = new lessc;
$less->setFormatter("compressed");
try {
// Compiles only if $less_file mtime != $css_file mtime
$less->checkedCompile($less_file, $css_file);
} catch (Exception $e) {
header('HTTP/1.0 500 Internal Server Error');
echo $e->getMessage();
die();
}
$fp = fopen($css_file, 'r');
$stat = fstat($fp);
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $stat['mtime']) {
header('HTTP/1.0 304 Not Modified');
} else {
header('Cache-Control: must-revalidate');
header('Content-Type: text/css; charset=utf-8');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $stat['mtime']) . ' GMT');
if ($enable_gzip) {
header('Content-Encoding: gzip');
ob_start("ob_gzhandler");
}
fpassthru($fp);
}
fclose($fp);
@eduardomart

This comment has been minimized.

Copy link

eduardomart commented Jan 8, 2014

You're missing the closing PHP tag at the end.

?>

@J05HI

This comment has been minimized.

Copy link

J05HI commented Jan 11, 2016

You don't need the closing tag anymore.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.