Typecho 文档:加快后台打开速度
适用程序:Typecho
程序版本:1.2.1
文档作者:Lopwon
作者博客:Lopwon.com
发布页面:Lopwon.com/3564.html
许可方式:CC BY-NC-SA
注意:此文档源于作者在博客改造中的一些经验总结,转载还请署名。
敬告:此文档操作涉及程序核心文件的修改,作者不对你在使用中产生的任何问题造成的不良后果,承担责任。
文档说明
每次打开 Typecho 后台时,都有明显的卡顿,在没有读取完成(官方最新日志)之前,点击控制台的任何链接都没反应,需要等待至少 3~5 秒钟,数据加载显示后,所点击的链接页面才会打开。于是,琢磨出本文档,把(官方最新日志)的数据缓存到本地文件中,在指定的有效期内,通过加载缓存文件的数据,加快后台打开速度。嗯,反正官方最新日志也不常更新。
使用方法
A 涉及文件
admin/index.php
var/Widget/Ajax.php
B 改造文件
作用:缓存官方最新日志,加快后台打开速度
打开文件 admin/index.php 找到第 115 行的如下代码:
html = cache ? cache.getItem('feed') : '',
将以上代码替换为以下代码:
html = '',
打开文件 var/Widget/Ajax.php 搜索找到 function feed() 将函数 {...} 内的所有代码,替换为以下代码(留意注释,以及按需修改):
$cacheFilePath = __TYPECHO_ROOT_DIR__ . '/usr/cache/Typecho_feed_cache.json'; // 将官方最新日志数据存储在 usr/cache 目录的 Typecho_feed_cache.json 文件中,自行修改
$cacheExpiration = 180*24*60*60; // 缓存半年,自行修改
if (file_exists($cacheFilePath) && (time() - filemtime($cacheFilePath)) < $cacheExpiration) {
$data = json_decode(file_get_contents($cacheFilePath), true);
$this->response->throwJson($data);
} else {
$this->user->pass('subscriber');
$client = Client::get();
if ($client) {
$client->setHeader('User-Agent', $this->options->generator)
->setTimeout(10)
->send('https://typecho.org/feed/');
// 匹配内容体
$response = $client->getResponseBody();
preg_match_all(
"/<item>\s*<title>([^>]*)<\/title>\s*<link>([^>]*)<\/link>\s*<guid>[^>]*<\/guid>\s*<pubDate>([^>]*)<\/pubDate>/is",
$response,
$matches
);
$data = [];
if ($matches) {
foreach ($matches[0] as $key => $val) {
$data[] = [
'title' => $matches[1][$key],
'link' => $matches[2][$key],
'date' => date('n.j', strtotime($matches[3][$key]))
];
if ($key > 8) {
break;
}
}
}
file_put_contents($cacheFilePath, json_encode($data));
$this->response->throwJson($data);
}
}
throw new Exception(_t('禁止访问'), 403);
注意:以上代码中,未对存储文件夹做是否可写的判断,所以,请确保文件夹可以创建缓存文件。
至此,在首次访问控制台时,官方最新日志数据会缓存到指定目录指定文件中,并在有效期内从缓存文件获取数据,加快后台打开速度。
方法二
以上方法不能及时获取官方最新日志数据,需要在缓存文件有效期过后才能更新,可以使用以下方法:通过手动点击获取数据,避免打开页面时自动获取,也不需要生成缓存文件。
A 涉及文件
admin/index.php
B 改造文件
作用:将自动获取数据调整为手动
打开文件 admin/index.php 找到第 113 行的 JS 代码:
$(document).ready(function () {
// 原有的声明变量代码,保持不变
ul.html('<li><button id="loadData">点击读取数据</button></li>'); // 添加按键
$('#loadData').click(function() { // 点击按键后,再执行原有的获取数据代码
// 原有的获取数据代码,保持不变
});
});
至此,在打开后台时,不会自动获取数据,在点击按键后,再手动获取数据。
方法三
A 涉及文件
var/Widget/Ajax.php
B 改造文件
作用:缩短获取数据的时间
打开文件 var/Widget/Ajax.php 找到(两处)以下代码:
setTimeout(10)
将以上代码的时间 10
改为 1