Typecho 文档:加快后台打开速度

2023年09月13日

适用程序: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

store