本文最后更新于 2020-05-19【130 天前】,文中所描述的信息可能已发生改变,请谨慎使用。如有问题或建议,欢迎在文章底部留言参与讨论!

再好的网站,如果打开速度过慢,可能大部分都不会等到页面加载完就选择右上角离开,提升网站页面加载速度的一个非常重要的优化方法便是静态化。而作为网站门面的首页,访问量相对比其他页面要大的多,实现静态化提升速度显得更加重要。

前言

Typecho、WordPress 等动态程序的页面内容的生成依赖后台对数据的查询 (在不加 Redis/Memecache 等数据库缓存下),其访问速度天然地比静态页面要慢,那么实现静态化就是最直接有效的网站速度优化方法。

对于这些程序而言,一般都会有开发者提供插件进行实现页面的静态化,在这里,我们可以仅对首页实现静态化,而不必借助插件。具体的实现方法非常简单,仅需一个简短的 php 文件即可实现。

创建生成静态化脚本文件

在网站根目录下创建一个 cache.php 文件,其内容如下:

<?php
/* https://www.imtqy.com/cache-index.html */
$nowtime=time();
$pastsec = $nowtime - $_GET["t"];
if($pastsec<600)
{
exit; /* 10分钟更新一次,时间可以自己调整 */
}
ob_start(); /* 打开缓冲区 */
include("index.php");
$content = ob_get_contents(); /* 得到缓冲区的内容 */
$content .= "\n<script language=javascript src=\"cache.php?t=".$nowtime."\"></script>"; /* 加上调用更新程序的代码 */

file_put_contents("index.html",$content);
if (!function_exists("file_put_contents"))
{
function file_put_contents($fn,$fs)
{
$fp=fopen($fn,"w+");
fputs($fp,$fs);
fclose($fp);  
}
}
?>
其实文件名可以任意修改,但要注意的是,文件名需和代码中提到的文件名一致!
代码文件来自于:https://itlu.org/articles/1857.html

访问并生成静态化首页

为了测试是否成功,我们可以人为的访问该文件,使其生成首页的静态化文件 index.html,访问地址为网站域名/cache.php,如本站访问地址为 https://www.imtqy.com/cache.php

查看网站根目录,是否生成了 index.html 文件,如有,则表明正确生成了静态化的首页文件。

配置优先级使静态页面生效

最后,我们还需要在网站的 Web 服务器的站点配置文件中,将 index.html 的优先级调整到比 index.php 高,对于 nginx 而言,即将网站的配置 conf 文件中,在表明网站首页的配置中(即以 index 开头的那行 ),让 index.htmlindex.php 前面即可。如

index index.html index.htm index.php

而对于 Apache,则修改 DirectoryIndex

说明

该方法不仅仅适用于 Typecho/Wordpress 等程序的首页静态化,理论上对于其他的任何的动态程序的首页都可以实现静态化,进而优化网站访问。

有网友提到这套代码容易被人利用实现 CC 攻击,可以采用优化版的静态化程序:https://gist.github.com/yusureabc/34564707391b6275864b94b3cdc0088f

<?php
/**
 * 首页静态化脚本
 * Author: Yusure
 * Blog: http://yusure.cn/php/202.html 、
 * https://gist.github.com/yusureabc/34564707391b6275864b94b3cdc0088f
 */
ini_set( 'date.timezone', 'PRC' );
 
/* 缓存过期时间 单位:秒 */
$expire = 600;
/* 主动刷新密码  格式:http://test.com/cache.php?password=123456 */
$password = '123456';
$file_time = @filemtime( 'index.html' );
time() - $file_time > $expire && create_index();
isset( $_GET['password'] ) && $_GET['password'] == $password && create_index();
 
/**
 * 生成 index.html
 */
function create_index()
{
    ob_start();
    include( 'index.php' );
    $content = ob_get_contents();
    $content .= "\n<!-- Create time: " . date( 'Y-m-d H:i:s' ) . " -->";
    /* 调用更新 */
    $content .= "\n<script language=javascript src='cache.php'></script>";
    ob_clean();
    $res = file_put_contents( 'index.html', $content );
    if ( $res !== false )
    {
        die( 'Create successful' );
    }
    else
    {
        die( 'Create error' );
    }
}

这个版本相比于之前的在于主动生成需要密码,否则只能根据文件是否过期来生成静态文件。

因文章设置了复制长度限制,提供脚本文件下载地址:
蓝奏云:https://qytang.lanzous.com/icslepa
密码:6666
解压密码:imtqy.com
文章目录


推荐使用:阿里云 云翼计划学生优惠、ECS、轻量应用等产品与服务【 点击注册

本文作者:Quanyin Tang

本文链接:Typecho/Wordpress 等动态程序免插件实现首页生成静态 HTML - https://www.imtqy.com/cache-index.html

版权声明:如无特别声明,本文即为原创文章,仅代表个人观点,版权归 Quanyin 所有,未经允许禁止转载,经授权转载请注明出处!