2015-09-01 34 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()); 
    } 
}