本站承诺永不接任何虚假欺骗、联盟广告、弹窗广告、病毒广告、诱导充值等影响用户体验的广告,广告屏蔽插件会影响本站部分功能,还请不要屏蔽本站广告,感谢支持!

当前位置:首页 / 正文

2022-12-29 | 编程技术 | 465 次阅读 | 等你评论 | 3 次点赞 | 繁体

typecho 是一个伪静态的博客系统,如果不使用缓存,每次打开页面都会查询数据库,访问人数多了以后服务器压力倍增。

但是,typecho 是一个 php 的程序,我们可以利用 php 将实时页面保存成 html,设置一个失效时间,如果在失效时间内就不用查询数据库重新生成页面,直接返回 html 即可。

设置教程

1、设置缓存文件保存目录

在 typecho 根目录下,新建一个 cache 目录,授予可写权限

2、PHP 配置

PHP.ini 环境配置文件要改一下,将 allow_url_include = On

3、设置缓存

1)打开根目录下的 index.php 文件,在 /** 初始化组件 */ 上方添加如下代码:

$file = $_SERVER['REQUEST_URI']; // 获取访问url
$htmlfile='./cache/'.md5($file).'.html';  // url使用md5加密后生成缓存文件路径
// echo($htmlfile);
// 如果是 get 请求,并且对应缓存文件存在,并且文件创建时间小于 600 秒,就直接返回配置文件
if($_SERVER['REQUEST_METHOD']=='GET' and file_exists($htmlfile) and ((time()-filemtime($htmlfile))< 600)){
    include($htmlfile);
    exit;
}

2)在 index.php 文件的最后,添加如下代码:

// 如果请求是get,并且不是评论相关的页面,则进行缓存
if($_SERVER['REQUEST_METHOD']=='GET' and strpos($file,'comment')<1 and strpos($file,'feed')<1 and strpos($file,'sitemap')<1){
    $content=ob_get_contents(); //得到缓冲区的内容
    file_put_contents($htmlfile, $content); //写入缓存文件
}

添加完之后如图:

图片alt

怎么判断是不是走缓存了?

1、上边代码添加完之后,访问一次首页,看看 cache 目录是否生成了相关缓存文件;
2、可以用 php 语言在网站页面底部添加一个时间,生成缓存之后刷新页面,看时间变不变;
3、感受一下页面打开速度;

附:本站页面底部时间生成代码:

<?php echo date("Y-m-d H:i:s");?>

其他问题

由于本站浏览量是在 functions.php 文件里添加如下代码实现的:

function Postviews($archive) {
    $db = Typecho_Db::get();
    $cid = $archive->cid;
    if (!array_key_exists('views', $db->fetchRow($db->select()->from('table.contents')))) {
        $db->query('ALTER TABLE `'.$db->getPrefix().'contents` ADD `views` INT(10) DEFAULT 0;');
    }
    $exist = $db->fetchRow($db->select('views')->from('table.contents')->where('cid = ?', $cid))['views'];
    if ($archive->is('single')) {
        $cookie = Typecho_Cookie::get('contents_views');
        $cookie = $cookie ? explode(',', $cookie) : array();
        if (!in_array($cid, $cookie)) {
            $db->query($db->update('table.contents')
                ->rows(array('views' => (int)$exist+1))
                ->where('cid = ?', $cid));
            $exist = (int)$exist+1;
            array_push($cookie, $cid);
            $cookie = implode(',', $cookie);
            Typecho_Cookie::set('contents_views', $cookie);
        }
    }
    echo $exist;
}

这就导致设置缓存以后,浏览量不会增加了,如果是跟我一样的浏览量实现方式,可以在 functions.php 文件里增加如下函数:

function addPostviews($cid) {
    $db = Typecho_Db::get();
    if (!array_key_exists('views', $db->fetchRow($db->select()->from('table.contents')))) {
        $db->query('ALTER TABLE `'.$db->getPrefix().'contents` ADD `views` INT(10) DEFAULT 0;');
    }
    $exist = $db->fetchRow($db->select('views')->from('table.contents')->where('cid = ?', $cid))['views'];
    $cookie = Typecho_Cookie::get('contents_views');
    $cookie = $cookie ? explode(',', $cookie) : array();
    if (!in_array($cid, $cookie)) {
        $db->query($db->update('table.contents')
            ->rows(array('views' => (int)$exist+1))
            ->where('cid = ?', $cid));
        $exist = (int)$exist+1;
        array_push($cookie, $cid);
        $cookie = implode(',', $cookie);
        Typecho_Cookie::set('contents_views', $cookie);
    }
    echo $exist;
}

然后在 post.php 文件顶部增加如下代码:

<?php
//  判断是否是浏览量的 POST 请求
if (isset($_POST['view'])) {
    //  判断 POST 请求中的 cid 是否是本篇文章的 cid
    if ($_POST['view'] == $this->cid) {
        //  调用点赞函数,传入文章的 cid
        exit(addPostviews($this->cid));
    }
    //  如果点赞的文章 cid 不是本篇文章的 cid 就输出 error 不再往下执行
    exit('error');
}
?>

图片alt

最后用 js 在 post.php 文件底部增加一个 post 请求就行了:

// 浏览量
$.post('<?php $this->permalink(); ?>',{'view':<?php echo $this->cid; ?>},function(result){
    console.log(result);
});

导致这个问题的原因是,原来的浏览量增加是利用 php 函数获取浏览量的同时增加浏览量,但是缓存之后的 html 页面已经没有 php 的代码了,只有 php 缓存的时候生成的结果,所以相应的浏览量肯定不会增加了,但是 js 代码是会缓存到 html 中的,所以我们利用 js 发送一个 post 请求,后端接收到请求去更新一下浏览量就可以解决了。

标签: php前端教程typecho缓存

猜你喜欢
Typecho纯代码生成sitemap站点地图
想要实现 Typecho 纯代码生成 sitemap 站点地图只需要 2 步就够了。1、在博客主题目录新建 sitemap.php 页面,放入以下代码:<?php /** *HTML版网站...
Lazysizes.js图片懒加载的使用
lazysizes 是一种快速(无垃圾),对 SEO 友好且可自动初始化的 lazyloader,用于图像(包括响应图像 picture/ srcset),iframe,脚本/小部件等。它还通过...
通用的检测到广告屏蔽插件进行弹窗提示实现方法
用的 js 方法来检测,按理说所有博客都能使用,就是在打开网页的时候进行一次判断。如果发现没有加载广告代码,就会出来一个弹窗来提示浏览者将本站加到广告拦截插件的白名单里面。别喷我,个人站长经营实...
javascript | 原生JS多语言切换简单实现
由于项目需要实现一个前端的多语言切换,不想因为一个简单的功能就引入 jQuery,所以经过 google 编程大法摸索出一个原生 JS 就可以实现的多语言前端切换的小例子,仅供参考。<bo...
NUC8黑苹果更新OpenCore引导教程
鉴于本人的苹果笔记本年代久远,又想用最新的系统,所以早早就入手了 NUC8,并且成功安装了 macOS,使用 OC 引导,由最初的 macOS Catalina 10.15.7 陆续升级到了 m...
局域内网的服务器利用个人电脑做跳板机访问互联网
公司内网的服务器均不连公网(互联网),问题来了:现在服务器上需要安装一些软件怎么办?目前一般都是编译安装!先将软件在外网机器上下载好,然后再复制到服务器内,编译安装!这种方式缺点就是比较麻烦,编...
ssh-chat- SSH命令行下聊天摸鱼服务
ssh-chat 是一个使用 Go 语言编写的定制 SSH 服务器,当你连到该服务器时就会进入聊天模式,就好像以前的终端 BBS 系统一样。官方 Github: https://github.c...
Linux VPS 安装 5.9 宝塔面板并免费升级到专业版
宝塔面板是一款服务器管理软件,支持 windows 和 linux 系统,可以通过 Web 端轻松管理服务器,提升运维效率。例如:创建管理网站、FTP、数据库,拥有可视化文件管理器,可视化软件管理器,
基于本地数据库的 IP 地址查询 |PHP 源码
网上有很多第三方的 IP 地址查询 API 接口,直接调用第三方的接口很方便,但也容易失效导致无法使用。因此今天来分享一个基于本地数据库的 IP 地址查询源码! # 模块代码 ```
(首次提交评论需审核通过才会显示,请勿重复提交)