2015-09-01 33 views
4

我有一個PHP網站,其中一些頁面已經創建了一個完整的輸出緩存文件,雖然沒有保存爲.html並且請求仍然從PHP發送,它錯過了託管緩存的靜態文件有非常好的表現。緩存整個PHP輸出到靜態html使用htaccess和modrewrite

將緩存文件保存在基於md5(Url)的目錄中。

我想知道如果用mod_rewrite可以獲得類似的結果,但是使用html靜態文件,我想我以前在一個WordPress緩存插件中看到類似的東西(但當時我並沒有太在意) )。

我可以使用什麼來代替md5()mod_rewrite來將整個Url轉換爲有效的唯一文件名?

我的地址是虛擬的路線,非常簡單:/level1/level2/level3/(是一個工作仍在進行中,但我不認爲使用3級以上,levelN顯然是一個例子,可以是任何文字)

要簡化我想要的:

mod_rewrite:/cache/unique(Url).html是否存在?加載它

php:/cache/unique(Url).html不存在?創建它

我可以使用什麼unique

+0

請詳細說明*哪些頁面已經創建完整的輸出緩存文件*。 –

+0

@JasonMcCreary基於URL /路由我選擇是否要緩存頁面,*緩存文件*保存一個小的有效負載(然後用於檢查它是否過期)。我沒有寫出當前的緩存系統,我認爲這與問題無關。 – Alex

回答

3

是的,你可以做到這一點,我不會提供整個代碼只是想法就夠了。

讓我們先從你的方式,把它重定向每個丟失的文件到您的目錄索引的.htaccess 的.htaccess
寫。 它可能看起來像這樣

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule^index.php [QSA,L] 

現在,您將獲得請求的index.php如果調用頁面沒有找到。

與使用散列文件名稱不同,可以使用目錄結構,這樣可以更快,更具人類可讀性。

您可以即時創建目錄。

的index.php
數據推回瀏覽器以確保你得到這一切在一個變量之前。你可以用做到這一點,包括的功能。 參見this page上的實施例5。

保存基於目錄級別的數據。

$levels = explode('/',<REQUESTED_URI>); 
$filename = array_pop($levels); 
foreach($levels as $level) 
    // Create Directory if does not exit 

最後,這只是基本的想法,你必須自己弄清楚你的推特和技巧。

+0

謝謝,我對PHP端沒有任何問題,是我不知道的'.htaccess' /'mod_rewrite'語法,我想知道詳細信息。雖然我可以使用目錄和子目錄,但我寧願將所有內容都保存在一個目錄中。一個簡單的'mod_rewrite' *斜線*到*短劃線*我會認爲 – Alex

+0

是的,在SO上有很多關於這個問題的問題。 – anwerj

1

最後很簡單,雖然我不得不使用Url的相同目錄和子目錄,但我記得的WordPress插件是超級緩存,我使用的mod_rewrite幾乎相同。

轉化URL以.htaccessmod_rewrite是可能的,但並不簡單,並與一些限制(但即使使用RewriteMapprg如果你有機會到服務器配置MD5)。

.htaccess如果靜態緩存文件存在,將其加載:

RewriteCond %{DOCUMENT_ROOT}/cache/$1/index.html -f 
RewriteRule ^(.*) /cache/$1/index.html [L] 

PHP,我使用的是笨,但應該很容易只編輯PHP,也許使用ob_startob_get_clean

private function cache_output() { 
    $this->load->helper('url'); 
    $uri = uri_string(); /* expect something like: level1/level2 (no heading/trailing slash */ 
    $dir = FCPATH.'cache'.DIRECTORY_SEPARATOR.str_replace('/',DIRECTORY_SEPARATOR,$uri); 
    $file = $dir.DIRECTORY_SEPARATOR.'index.html'; 
    if (!file_exists($file)) { 
     if (!is_dir($dir)) { 
      mkdir($dir, 0755 & ~umask(), TRUE); 
     } 
     $output = $this->output->get_output(); 
     file_put_contents($file, $output); 
     chmod($file, 0644 & ~umask()); 
    } 
}