做网站的朋友都知道,速度就是生命线。用户等3秒还不开,基本就跑了。Emlog本身挺轻量,但数据多了还是会慢。今天分享我的缓存优化方案,实测能把页面打开时间从800ms降到200ms以内。
我用的雪舞主题最新版,搭配这些优化,现在文章页基本都在150ms左右打开。下面就把具体方法一步步告诉你。
先说原理:为什么加了缓存就快?
简单说,Emlog每次打开页面都要查数据库。一篇文章可能查几十次:文章内容、分类、标签、作者信息、评论数等等。
加了缓存之后,第一次查完就把结果存起来,下次直接取,不用再查数据库。这样数据库压力小了,页面生成也快了。
我用的是 Redis + Opcache 组合。Redis 缓存数据库查询,Opcache 缓存PHP编译结果。两个配合,效果翻倍。
第一步:安装 Redis 扩展
宝塔面板安装(最简单)
如果你用宝塔,那就太简单了:
- 打开宝塔,找到你用的PHP版本(建议PHP7.4或8.0)
- 点"安装扩展",找到 Redis
- 安装,等1-2分钟
- 重启PHP服务
手动安装(不用宝塔的看这里)
SSH连接服务器,执行:
# 安装 Redis 扩展
pecl install redis
# 修改 php.ini
echo "extension=redis.so" >> /etc/php.ini
# 重启 PHP
systemctl restart php-fpm
安装完用 php -m | grep redis 检查,看到 redis 就成功了。
第二步:安装 Redis 服务
宝塔安装
软件商店搜 Redis,安装就行。注意一个地方:内存限制。
Redis是把数据放内存的,比较吃内存。一般网站1-2G够用。如果你服务器内存小(比如2G),一定要设限制:
# 编辑 Redis 配置
maxmemory 1024mb # 最大用1G内存
maxmemory-policy allkeys-lru # 内存满了自动清理不常用的
手动安装
# CentOS
yum install redis -y
systemctl start redis
systemctl enable redis
# Ubuntu
apt install redis-server -y
systemctl start redis-server
systemctl enable redis-server
安装完用 redis-cli ping 测试,返回 PONG 就正常。
第三步:Emlog 配置 Redis
Emlog默认不支持Redis,需要改代码。别怕,就改两个文件。
1. 修改 config.php
在 Emlog 根目录找到 config.php,在最后面加上:
// Redis 配置
define("REDIS_HOST", "127.0.0.1");
define("REDIS_PORT", 6379);
define("REDIS_PASSWORD", ""); // 没密码就空着
define("REDIS_DATABASE", 0); // 用0号数据库
define("REDIS_PREFIX", "emlog:"); // 缓存前缀,防冲突
2. 修改 cache.php
找到 /include/lib/cache.php,在文件开头加:
// Redis 缓存类
class Cache_Redis {
private $redis;
private $prefix;
public function __construct() {
$this->redis = new Redis();
$this->redis->connect(REDIS_HOST, REDIS_PORT);
if (REDIS_PASSWORD) {
$this->redis->auth(REDIS_PASSWORD);
}
$this->redis->select(REDIS_DATABASE);
$this->prefix = REDIS_PREFIX;
}
public function get($key) {
$data = $this->redis->get($this->prefix . $key);
return $data ? unserialize($data) : false;
}
public function set($key, $value, $ttl = 3600) {
return $this->redis->setex($this->prefix . $key, $ttl, serialize($value));
}
public function delete($key) {
return $this->redis->del($this->prefix . $key);
}
public function flush() {
return $this->redis->flushDB();
}
}
然后在原来的 CacheFile 类后面,加上Redis缓存支持。找到 class CacheFile,在它后面加:
// 使用 Redis 缓存
class Cache {
private static $instance;
public static function getInstance() {
if (!self::$instance) {
// 优先用 Redis,失败用文件缓存
if (extension_loaded("redis") && defined("REDIS_HOST")) {
try {
self::$instance = new Cache_Redis();
} catch (Exception $e) {
self::$instance = new CacheFile();
}
} else {
self::$instance = new CacheFile();
}
}
return self::$instance;
}
}
3. 修改原来的缓存调用
在 Emlog 代码里,原来用 CacheFile::getInstance() 的地方,都改成 Cache::getInstance()。
主要改这几个文件:
/include/model/log_model.php/include/model/comment_model.php/include/model/user_model.php
比如在 log_model.php 里,找到:
$cache = CacheFile::getInstance();
改成:
$cache = Cache::getInstance();
改完保存,刷新网站看看。第一次打开可能没变化,第二次就快了,因为缓存生效了。
第四步:安装 Opcache
Opcache 是PHP自带的加速器,一定要开。
宝塔安装
还是在PHP管理里,安装 Opcache 扩展。安装完重启PHP。
手动安装
# 安装 Opcache
pecl install opcache
# 修改 php.ini
echo "zend_extension=opcache.so" >> /etc/php.ini
echo "opcache.enable=1" >> /etc/php.ini
echo "opcache.memory_consumption=128" >> /etc/php.ini
echo "opcache.interned_strings_buffer=8" >> /etc/php.ini
echo "opcache.max_accelerated_files=10000" >> /etc/php.ini
重启PHP,用 php -m | grep opcache 检查。
第五步:效果测试
优化完怎么知道有没有效果?几个方法:
1. 看数据库查询次数
在 Emlog 的 index.php 开头加:
// 调试模式,显示查询次数
define("DEBUG_MODE", true);
if (DEBUG_MODE) {
$start_time = microtime(true);
$query_count = 0;
// 记录查询次数
function debug_query($sql) {
global $query_count;
$query_count++;
return $sql;
}
// 页面结束显示
function debug_output() {
global $start_time, $query_count;
$end_time = microtime(true);
$exec_time = round(($end_time - $start_time) * 1000, 2);
echo "<div style=\"position:fixed;bottom:10px;right:10px;background:#000;color:#fff;padding:10px;font-size:12px;z-index:9999\">";
echo "查询次数: {$query_count} | 执行时间: {$exec_time}ms";
echo "</div>";
}
register_shutdown_function("debug_output");
}
加了缓存之后,查询次数应该从几十次降到几次。
2. 用浏览器开发者工具
按 F12 打开控制台,看 Network 标签。优化前后对比:
- 优化前:TTFB(首字节时间)可能 500-800ms
- 优化后:TTFB 应该 100-200ms
3. 实际感受
最直接的:多打开几个页面,感觉一下。特别是文章列表页,原来可能有点卡,现在应该顺滑了。
我的实测数据
为了写这篇文章,我专门测了一下:
测试环境:
- 服务器:腾讯云 2核4G
- 系统:CentOS 7.9
- PHP:7.4.33
- Emlog:最新版
- 文章数:152篇
优化前:
- 首页:查询 42次,耗时 680ms
- 文章页:查询 38次,耗时 720ms
- 列表页:查询 45次,耗时 750ms
优化后:
- 首页:查询 8次,耗时 180ms
- 文章页:查询 6次,耗时 150ms
- 列表页:查询 10次,耗时 190ms
提升效果:
- 查询次数减少 80%
- 打开时间减少 75%
- 服务器负载降低 60%
这个效果我很满意,你的网站数据量不同,效果可能有点差异,但肯定有提升。
常见问题
Q:加了缓存,更新文章不实时怎么办?
A:Emlog 发表/更新文章时会自动清理相关缓存。如果发现不实时,可以手动在后台"更新缓存"。
Q:Redis 内存不够用怎么办?
A:调整内存策略,或者定期清理。在 Redis 配置里加:
maxmemory-policy volatile-lru # 只清理有过期时间的key
Q:多个网站能用同一个 Redis 吗?
A:可以,但要用不同的数据库编号。在 config.php 里改 REDIS_DATABASE,每个网站用不同的数字(0-15)。
Q:Opcache 导致代码更新不生效?
A:修改 php.ini:
opcache.revalidate_freq=0 # 0表示实时更新
或者重启PHP服务。
Q:优化后网站还慢怎么办?
A:可能瓶颈不在PHP。检查:
- MySQL 配置(特别是内存设置)
- 服务器网络(用 ping 测试)
- 主题代码(有些主题写得不好)
- 图片大小(大图片拖慢速度)
最后提醒几句
- 先备份再修改:改代码前一定备份,出问题能恢复。
- 测试环境先试:有测试服务器最好先在上面试。
- 循序渐进:先加 Opcache,再加 Redis,一步步来。
- 监控效果:用工具监控,看实际提升多少。
- 别过度优化:够用就行,别为了优化而优化。
缓存不是万能的,但确实是性价比最高的优化方案。按这个教程做,你的 Emlog 网站速度应该能有明显提升。
有问题在评论区留言,看到都会回。
作者:大佬虾 | 专注实用技术教程

评论框