2013-03-18 22 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); 
}