我有一个相当基本的网站,用纯PHP编写,没有使用框架,在基本的LAMP环境中运行。
该站点根据HTTP用户代理标头和一些查询字符串参数动态生成标记。例如,“itemdetail.php”将检查查询字符串参数“itemid”和用户代理标题并生成一些标记。
我想缓存此标记,以便下次查询字符串中具有相同用户代理和itemid的设备尝试请求该页面时,它只会转储其缓存中的任何标记。
我意识到我可以使用memcache在php中手动执行此操作,只需在页面顶部编写一些代码来检查相关参数,然后尝试从memcached提供或渲染页面并将标记存储在memcached中,但是我认为可以完全避免PHP层,使用类似于此处描述的内容http://httpd.apache.org/docs/2.2/caching.html
所以,我的问题,我意识到可能是模糊的,这个帖子将被杀死是:
这里推荐的缓存实现是什么?确实是在php级别使用memcache,还是apache模块足以满足我的需求?
答案 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