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

当前位置:首页 / 正文

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

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缓存

猜你喜欢
使用 Vercel + Supabase 零成本部署 Umami
早些年用过友盟、51.la、百度统计、Google Analytics,各有各的优缺点,百度统计目前只允许备案网站使用,友盟和 51.la 体验效果不喜欢,Google Analytics 访问...
[Go]包依赖管理工具go mod使用详解
go module 是 Go 语言从 1.11 版本之后官方推出的版本管理工具,并且从 Go 1.13 版本开始,go module 成为了 Go 语言默认的依赖管理工具。Modules 官方定...
薅京东羊毛必备抓取Cookies教程
本文只介绍如何利用安卓手机浏览器获取京东 cookie 教程,具体为什么要获取 cookie 以及如何薅羊毛请查看:闲置服务器薅京东的羊毛—青龙面板部署与京东签到第一步,下载工具去各大应用商店搜...
Typecho纯代码生成sitemap站点地图
想要实现 Typecho 纯代码生成 sitemap 站点地图只需要 2 步就够了。1、在博客主题目录新建 sitemap.php 页面,放入以下代码:<?php /** *HTML版网站...
Lazysizes.js图片懒加载的使用
lazysizes 是一种快速(无垃圾),对 SEO 友好且可自动初始化的 lazyloader,用于图像(包括响应图像 picture/ srcset),iframe,脚本/小部件等。它还通过...
MAC外接屏幕亮度调节工具——BrightnessE
该软件是远景一位大佬自制自用的软件,以下是大佬分享原文 自制的外置显示器亮度调节工具——BrightnessE-远景论坛-微软极客社区 https://bbs.pcbeta.com/viewt
Excel 纵向查找函数 vlookup() 使用入门
# 函数介绍 VLOOKUP 函数是 Excel 中的一个纵向查找函数,在日常工作中,我们时长需要从总表中查找出一下数据,比如一个活动哪些人参加,这是仅仅知道姓名或者工号,那需要怎样从总表里获取
(首次提交评论需审核通过才会显示,请勿重复提交)