2013-03-18 43 views
2

我正在使用PHP脚本以及一些.htaccess规则来实现缓存清除,以自动对静态网站上的文件进行版本控制。对静态页面错误的PHP自动版本化

脚本的来源是在这里: 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']); 
} 
?> 

使用上的脚本,CSS等功能中的header.php:

<?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的解释会有所不同,并且在版本控制期间无法正确定位文件。

任何想法?

+0

在F ile不存在。没有状态(stat)可以从不存在的文件中读取。 – Bart 2013-03-18 20:50:13

+0

哦,我明白了。手动定义网站根目录或文件路径的正确语法是什么? – questy 2013-03-18 20:52:23

+0

类似于:'$ ver = file_exists($ versionedFile)? 1:readVersion();'http://php.net/manual/en/function.file-exists.php – Bart 2013-03-18 20:59:46

回答

1

它看起来像你的问题是你传递一个相对URL到你的版本功能,这需要在光盘上的文件路径,和/或你在共享平台和$ _SERVER ['DOCUMENT_ROOT']是在服务器的根目录,而不是你的网站

为quickish修复我会定义一个常数,你的根,看起来可能是这个

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

然后尝试

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