如何最好地在服务器上缓存整个HTML输出

时间:2013-06-18 12:53:46

标签: php apache caching memcached

我有一个相当基本的网站,用纯PHP编写,没有使用框架,在基本的LAMP环境中运行。

该站点根据HTTP用户代理标头和一些查询字符串参数动态生成标记。例如,“itemdetail.php”将检查查询字符串参数“itemid”和用户代理标题并生成一些标记。

我想缓存此标记,以便下次查询字符串中具有相同用户代理和itemid的设备尝试请求该页面时,它只会转储其缓存中的任何标记。

我意识到我可以使用memcache在php中手动执行此操作,只需在页面顶部编写一些代码来检查相关参数,然后尝试从memcached提供或渲染页面并将标记存储在memcached中,但是我认为可以完全避免PHP层,使用类似于此处描述的内容http://httpd.apache.org/docs/2.2/caching.html

所以,我的问题,我意识到可能是模糊的,这个帖子将被杀死是:

这里推荐的缓存实现是什么?确实是在php级别使用memcache,还是apache模块足以满足我的需求?

3 个答案:

答案 0 :(得分:2)

根据用户代理生成不同的页面只是不好的做法。你不应该这样做。 如果您想缓存整个页面,因为您的网站很慢,可能必须在您的代码中搜索问题。

On-topic:编写一个简单的函数,用一个小的散列哈希函数(md5,sha1,...)来散列uri e.g。

<?php
$hash = md5('itemdetail.php-'.$itemid);
if ( file_exist('cache/'.$hash.'.html') {
  echo file_get_contents('cache/'.$hash.'.html');
  die();
}

然后在脚本结束时将结果保存为'cache /'.$ hash。'。html'; 您可以使用不同类型的扩展名或文件夹或... ...

如果您想在不使用PHP的情况下进行缓存,请查看Varnish。或者另一个例子发布在这里。

答案 1 :(得分:0)

如果您熟悉OpenCart,我写的就是这样做的。希望你会得到可能不熟悉的想法  上下文。

ob_start();
$enableCaching = false; // Boolean flag

$route = !isset($_GET['route']) ? 'home' : str_replace("/",'-',$_GET['route']);
$cacheFile = DIR_CACHE . $route . '.' . md5($_SERVER['QUERY_STRING']) . ".cache.tpl";

if ($enableCaching !== false && in_array($_GET['route'], $cachePages) && file_exists($cacheFile) ||
    $enableCaching !== false && file_exists($cacheFile) && !isset($_GET['route'])) {
    /**
     * This block of code will output the contents of the cache file.
     */
    require ($cacheFile);
}
else {
    /**
     * Cache file doesn't exist, process the request
     */ 
    $response->output();    

    if($enableCaching !== false && in_array($_GET['route'], $cachePages) || 
       $enableCaching !== false && !isset($_GET['route'])){
        file_put_contents($cacheFile, str_replace(array("\n","\r","\t"),'', str_replace("  "," ",ob_get_contents())));  
    }
}

基本上,根据文件名和任务字符串创建一个生成唯一文件名的变量。 创建该文件,将所有HTML输出写入该文件。

然后,当谈到处理请求时,您可以检查唯一的缓存文件是否存在,只是发送它而不是处理请求。

答案 2 :(得分:0)

使用memcached库... 你必须先安装它然后memcached提供和内存缓存系统的PHP