PHP自动版本控制静态页面错误

时间:2013-03-18 20:43:01

标签: php apache .htaccess static versioning

我正在使用PHP脚本以及一些.htaccess规则进行缓存清除,以便在静态网站上自动对文件进行版本控制。

脚本的来源在这里: http://www.particletree.com/notebook/automatically-version-your-css-and-javascript-files/

我更改了变量和函数的名称,但我认为这不是问题。

header.php中的脚本:

<?php
function VERSIONING($url){
$path = pathinfo($url);
$ver = '.'.filemtime($_SERVER['DOCUMENT_ROOT'].$url).'.';
echo $path['dirname'].'/'.str_replace('.', $ver, $path['basename']);
}
?>

在header.php中使用script,css等函数:

<?php VERSIONING('/resources/css/stylesheet.css'); ?>
<?php VERSIONING('/resources/js/script.js'); ?>
<?php VERSIONING('/resources/img/logo.png'); ?>

.htaccess缓存清除规则:

<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)\.(\d+)\.(js|css|jpe?g|png|gif|ico)$ $1.$3 [L]
</IfModule>

现在问题就在于此。它运行得很好,但每隔10-24小时,我在error_log文件中收到的错误就是我正在使用VERSIONING的每个文件。

每个错误都是这样的:

[16-Mar-2013 09:06:24] PHP Warning:  filemtime(): stat failed for /usr/local/apache/htdocs/resources/js/script.js in /home5/username/public_html/resources/header.php on line 42

第42行包含以下内容:

$ver = '.'.filemtime($_SERVER['DOCUMENT_ROOT'].$url).'.';

我不知道问题是什么。我唯一的猜测是,DOCUMENT_ROOT有时会被不同地解释,并且在版本控制期间无法正确定位文件。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

看起来您的问题是您将相对URL传递给您的版本控制功能,这需要光盘上的文件路径,和/或您在共享平台上,$ _SERVER ['DOCUMENT_ROOT']用于服务器的根,而不是您的网站

作为一个快速修复,我会为你的root定义一个常量,看起来可能是这个

define('SITE_ROOT', '/home5/username/public_html');

然后尝试

function VERSIONING($url){
  $path = SITE_ROOT.$url;
  $ver = '.'.filemtime($path).'.';
  echo str_replace('.', $ver, $url);
}