0

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

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

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

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

所以,我的问题是:

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

4

3 回答 3

2

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

主题:编写一个简单的函数,用一个小的散列函数(md5,sha1,...)对所提供的 uri 进行散列,例如

<?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。或此处发布的其他示例。

于 2013-06-18T13:04:18.137 回答
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 输出写入该文件。

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

于 2013-06-18T13:08:55.573 回答
0

使用 memcached 库...你必须先安装它,然后 memcached 为 php 提供内存缓存系统

于 2013-06-18T15:08:15.133 回答