缓存(自动版本)通过组合多个css文件创建的php文件的有效方法是什么


What is an efficient way to cache (auto version) a php file that is created by combining multiple css files?

我有一个名为main.css.php的php文件,它收集多个css文件并将它们作为一个大css文件输出。它收集的css文件的数量可以在1-10之间。代码是这样的:

header('Content-type: text/css');
header('Cache-Control: max-age=31536000');
ob_start("compress");
function compress($buffer) {
    /* remove comments */
    $buffer = preg_replace('!/'*[^*]*'*+([^/][^*]*'*+)*/!', '', $buffer);
    /* remove tabs, spaces, newlines, etc. */
    $buffer = str_replace(array("'r'n", "'r", "'n", "'t", '  ', '    ', '    '), '', $buffer);
    return $buffer;
}
// include css files
foreach ($css_files as $path) {
    if (file_exists($path)) {
        include_once($path);
    }
}
ob_end_flush();

所以我已经对该部分进行了排序,但现在我不知道如何缓存它,如果任何原始css文件发生变化,我可以更新缓存。正如这个答案中所建议的那样,我打算做一些类似的事情:

$cache = "";
foreach ($css_files as $path) {
    $cache.= filemtime($path);
}
...
echo "<link rel='stylesheet' href='/css/base.{$cache}.css'>";

然而,我不能使用这个apache重写规则:

RewriteEngine on
RewriteRule ^(.*)'.['d]{10}'.(css|js)$ $1.$2 [L]

因为我不确定$cache会有多长,因为它将包含多个unix时间戳。

摘要

我需要将多个css文件合并为一个php文件,该文件通过css头发送到浏览器。然后我需要正确地缓存这个文件,但如果任何原始css文件发生变化,我可以更新缓存。

任何关于我正在做的事情的建议、建议或更好的方法都将不胜感激。

您应该对$cache变量进行散列,并在文件名中使用它。它应该是这样的:

<?php
$cache = "";
foreach ($css_files as $path) {
    $cache .= filemtime($path);
}
$cache = md5($cache);

您的重写规则将使用哈希函数的长度;在这种情况下,我们使用32个字符长的md5:

RewriteEngine on
RewriteRule ^(.*)'.['d]{32}'.(css|js)$ $1.$2 [L]

希望对有所帮助

为什么不在磁盘上存储缓存信息?这样你就不必担心.htaccess.

$prevTimes = filegetcontents('/cache/css.txt')
if(array_sum($filetimes) != (int) $prevTimes){
  //recompile css
  //update csscacheinfo.txt with $newTimes
  //echo css file link for stylesheet using $newTimes.css as css file
} else {
  //echo css file link for stylesheet using $prevTimes.css as css file
}

仅供参考:存储/添加整数比连接和比较字符串更快。