0dbb4980acb58d4396e9a2055bf2176e

为 WordPress 加入 Redis 缓存优化访问性能

在之前的文章我是如何优化博客的本站在用的一些WordPress插件中我提到,我是使用了 WP-Optimize这个插件来进行博客优化的。

d2b5ca33bd970f64a6301fa75ae2eb22 11
WP Optimize

WP-Optimize 为用户提供了开箱即用的缓存方式,可以将你的 WordPress 文章加入文件缓存,从而减少在 MySQL 中查询的次数。

不过,文件缓存的问题是性能受限于你所使用的磁盘,而我使用的是阿里云的标准云磁盘,性能一般,所以访问速度并不能算快。

过去在我还愿意折腾 WordPress 的时候,我是会在 WordPress 上加入一些别的缓存的,比如 Redis、Memcached。不过,随着时间的流逝,我折腾的意愿变得越来越弱,就远离了这些。

直到最近刚好有空,于是开始研究起了 Redis 缓存。

其实在古早时代(比如我刚开始折腾个人博客的时候,2012年),WordPress 的 Redis 功能并不是特别好用,需要自己手动下载 object-cache.php 放在对应目录中,然后修改配置文件手动来开启,甚至还需要替换掉 index.php 文件来让请求通过缓存进行。

这次的折腾,让我感受到,时代在进步,配置缓存也变得简单了许多。

Requirements

在这篇博客中我并不打算介绍 Redis Server 的安装和调试过程,你可以在搜索引擎中找到各种各样的教程引导你如何完成安装的过程,因此,请自行完成 Redis Server 的安装,后续的各项操作会默认你已经完成了 Redis Server 的安装调试。

需要注意的是,如果你不打算修改配置文件,则需要在安装 Redis 之后,设置为空密码。而空密码是不安全的,建议你通过 iptables、安全组策略等方式,屏蔽掉 6379 端口的外部请求,只允许本地请求。

安装 Redis 缓存

我这次安装 Redis 缓存选择了 Redis Object Cache 这个插件。

d2b5ca33bd970f64a6301fa75ae2eb22 12
Redis Object Cache

和你在别的网站上看到的教程相比,这个插件提供了一个可视化的查看和管理的方式,对于懒得手动操作和编辑代码的人来说,更加友好。

安装插件后,启用插件,你可以在设置中的「Redis」设置页面找到如下的界面:

d2b5ca33bd970f64a6301fa75ae2eb22 13
设置页面

点击 Enable Object Cache,就会开启 Redis 的 Object Cache 。

如果你已经在之前配置好了 Redis Server,则会直接看到如下左图的界面。但如果你的 Redis Server 还没有配置或配置了密码,就会显示如下右图的界面,就需要你检查你的 Redis Server 是否配置成功。

d2b5ca33bd970f64a6301fa75ae2eb22 15
配置成功的情况
d2b5ca33bd970f64a6301fa75ae2eb22 14
配置失败的情况

当你看到如上左图的界面后,就说明你已经开启了 Redis 的 Object Cache 了,后续涉及到文章内容、菜单等各项基本配置的查询时,会优先使用 Redis 的缓存,而不是查询 MySQL,从而降低了 MySQL 的查询压力,提升了查询的诉求。

至此,你的 Redis 就配置好了,可以打开你的网站首页,享受飞一样的速度。

d2b5ca33bd970f64a6301fa75ae2eb22 17
开启前的 TTFB 为 2.29 秒
d2b5ca33bd970f64a6301fa75ae2eb22 16
开启后的 TTFB 为 673.49 毫秒

FAQ

1. 如何使用非本地 Redis Server 或如何使用带密码鉴权的 Redis Server?

如果你需要使用非本地的 Redis Server(比如云 Redis),那么你需要在你的 wp-config.php 中加入如下代码来进行配置。

define( 'WP_REDIS_HOST', '127.0.0.1' );
define( 'WP_REDIS_PORT', 6379 );
// define( 'WP_REDIS_PASSWORD', 'secret' );
define( 'WP_REDIS_TIMEOUT', 1 );
Code language: JavaScript (javascript)

2. 如果我一个服务器上有多个 Redis ,如何配置使数据不会混淆呢?

有两种方式,

第一种方式是可以给你的不同站点配置不同的 Redis DB,只需要在你的 wp-config.php 文件中加入如下的配置,即可实现不同的站点使用不同的 Redis 数据库,你可以从 0 开始,向上递增设定不同的 Redis 数据库。

define( 'WP_REDIS_DATABASE', 0 );
Code language: JavaScript (javascript)

第二种方式是你无法控制 Redis,必须使用同一个数据库,那么你可以通过给其添加不同的 salt 来实现即使使用同一个数据库,数据也不会产生混淆。

define('WP_CACHE_KEY_SALT', 'www_ixiqin_com_');
Code language: JavaScript (javascript)

3. Metrics 怎么理解?

在 Redis 设置页面,你可以看到另外有一个 Metrics Tab,这个 Tab 你可以看到你的插件的工作情况,方便你随时进行查询 & Debug。

第一个 Time 是指 Redis Object Cache 和 Redis 沟通,获取数据所需的时间,可以看到,我这里的查询时间大概是在 12ms,耗时不多。需要注意,你第一次看可能会注意到,这里有一个 Object Cache Pro ,灰色的 Object Cache Pro 其实是官方在推广其自家的付费插件,付费插件 $99/月,可以提供更好的 Redis 查询性能。

d2b5ca33bd970f64a6301fa75ae2eb22 18

第二个 Bytes 则是 Redis Object Cache 从 Redis 获取到数据的大小,当有人访问你的文章的时候,这个数据就会出现一个增长,访问结束后就会消失。

d2b5ca33bd970f64a6301fa75ae2eb22 19

第三个 Ratio 则是缓存的命中率,基本上保持在 99% + ,说明缓存的命中率还不错。

d2b5ca33bd970f64a6301fa75ae2eb22 20

最后一个 Calls 则是调用次数,免费版不会批量获取数据,因此,调用次数会很高,而在付费版,会一次性拿多个数据,从而获得更少的查询次数。不过我目前对于这个速度已经很满意了,就不再购买付费的版本了。

d2b5ca33bd970f64a6301fa75ae2eb22 21

延展阅读

b29692084bbb

WordPress 5.9 + 2022 主题,如何修改主题代码?

如果你使用了最新的 WordPress 5.9 以及其自带的 WordPress 2022 主题,你会发现有个问题:

修改主题代码去哪了?

d2b5ca33bd970f64a6301fa75ae2eb22 9

虽然提供的编辑器可以满足绝大多数需求,但对于一些特定场景下的开发需求(比如在 functions.php 中加入特定的逻辑,依然是需要修改代码的。

在当前的 5.9 版本中,主题的代码编辑器和插件的代码编辑器入口被移动到了「工具」当中,你需要到「工具」当中寻找对应的功能。

d2b5ca33bd970f64a6301fa75ae2eb22 10
b29692084bbb

对 WordPress 2012 主题的一些改动

在上一篇文章当中,我介绍了我为什么要迁移到 2012 这个主题,在这篇文章中,我将会向你介绍一下我对其做的一些修改。

加入广告信息

之前我接受了来自芦笋的广告赞助,作为权益,我答应为芦笋提供相应的广告展出,因此,我需要通过一些代码的修改,来实现对这部分内容的修改。

具体的修改方式是修改了 WordPress 2012 主题中的 content.php 这个文件,在合适的位置加入如下的代码

<!-- ads code start -->
<?php if(is_single()){ ?>
<a target="_blank" href="https://lusun.com/invite/20143" style="padding-bottom:10px"><img src="http://ixiqin.test/wp-content/uploads/2022/01/800498db4ecc3ecade82c7dfb0aaded5.png" class="wp-block-image" alt="白宦成邀请你注册芦笋,并赠送你 30 天高级版特权" style="max-width:100%"></img></a>
<?php }?>
<!-- ads code end -->
Code language: HTML, XML (xml)

文章页面的广告便是如此加上去的。

而侧边栏中的广告代码,则是通过 WordPress 自带的「小工具」功能来实现的,插入图片,并加入对应的链接即可。

首页显示摘要,而非全文

从阅读体验上来讲,在列表页面能看完所有内容自然是不错的,不过因为我的文章比较喜欢插入代码和图片,如果直接在文章页面展示所有内容,会导致页面看起来非常的混乱,所以我修改了对应的代码,将其调整为在首页展示摘要,而在内容详情页展示全文。

这里 2012 主题并未加入相对应的功能的开关,因此需要自行代码实现相应的功能。

原代码如下:

<?php if ( is_search() ) : // Only display excerpts for search. ?>
<div class="entry-summary">
	<?php the_excerpt(); ?>
</div><!-- .entry-summary -->
<?php else : ?>
<div class="entry-content">
	<?php the_content( __( 'Continue reading <span class="meta-nav">&rarr;</span>', 'twentytwelve' ) ); ?>
	<?php
	wp_link_pages(
		array(
			'before' => '<div class="page-links">' . __( 'Pages:', 'twentytwelve' ),
			'after'  => '</div>',
		)
	);
	?>
</div><!-- .entry-content -->
<?php endif; ?>
Code language: HTML, XML (xml)

新的代码如下:

<?php if (is_search()): // Only display excerpts for search.
?>
        <div class="entry-summary">
            <?php the_excerpt(); ?>
        </div><!-- .entry-summary -->
        <?php
else: ?>
        <?php if (is_single()): ?>
    <div class="entry-content">
            <?php the_content(__('Continue reading <span class="meta-nav">&rarr;</span>', 'twentytwelve')); ?>
            <?php
        wp_link_pages(array('before' => '<div class="page-links">' . __('Pages:', 'twentytwelve'), 'after' => '</div>',));
?>
        </div><!-- .entry-content -->
<?php
    else: ?>
<div class="entry-summary">
            <?php the_excerpt(); ?>
        </div><!-- .entry-summary -->
<?php
    endif; // is_single()
?>
        <?php
endif; ?>
Code language: HTML, XML (xml)

通过上述的代码实现,来控制了在首页 & 列表页面只显示摘要,而在具体的内容页面,展示全部内容。

摘要显示超过默认长度的数量

WordPress 默认的摘要长度是 55 ,而我写的内容如果只是默认的 55 ,可能看起来会比较奇怪,所以我会通过代码,将其调整为 100

function custom_excerpt_length( $length ) {
    return 100;
}
add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );
Code language: PHP (php)

加入面包屑展示

加入面包屑展示,有助于读者更好的在站内进行不同的导航,因此,借助于 All in One SEO 插件自带的面包屑功能,加入了面包屑。

<div id="aioseo_breadcrumbs" style="padding: 10px 0px;">
<?php if( function_exists( 'aioseo_breadcrumbs' ) ) aioseo_breadcrumbs(); ?>
</div>
Code language: HTML, XML (xml)
b29692084bbb

为什么放弃 WordPress 的 2022 主题

近几年,我基本上是保持着跟随官方的步伐,使用当年的默认主题,比如 2021 出了,我就用 2021 主题,当 2022 出了,我就用了 2022 主题。

前几天我也还在使用 WordPress 2022 主题,今天恰逢得空,我就还是把主题切换回了更加古老的 2012 主题。

聊聊为什么吧。

为什么要放弃 WordPress 2022 主题?

实际上,从 2020 开始,你就会发现,WordPress 的主题设计就会逐渐的倾向于「个人主义」的主题,增加了大量的展示自己的主题,包括我自己,也在过去的一年里,大量的使用了 2021 这个主题。

d2b5ca33bd970f64a6301fa75ae2eb22 8
2021 年我的博客的样子

但是,当我在 Beta 版试用 WordPress 的 2022 主题时,我发现这样的情况愈发的明显,甚至对于我来说,超出了我的能力范围。

2022 主题相比于 2021 主题,提供了更多的编辑的能力,用户可以用一个可视化的编辑界面,去修改你的网站的任何一个位置。从一个普通的用户者的角度来看,它赋予了用户更多的能力,可以去实现任何一个想要的效果。但从一个专业的开发者的角度来看,他从某种程度上束缚住了我的手脚,我再也不能对 WordPress 主题做任何修改(你只会获得一个「编辑器」)。此外,对于一个「不那么有审美」的人(比如我),可拖拽意味着你会拖拽出一个完全不合理的界面。

So,我放弃了2022 主题

为什么是 2012 ?

2012 是我最近在看 HappyXiao 的博客 注意到的,我发现 2012 这个 10年前的主题在处理不同设备之间的响应式、清爽感等方面做的非常好,作为一个阅读者,我的体验极佳。

而我同样希望给我的读者提供更多更加友好的阅读体验,于是,我就选择了 2012 来作为当下我的主题。

当然,这个主题并不一定完全符合我的要求,因此,我也做了一些基本的改进,这些改进,后续我会单独写一篇文章来说明。

cars parked on parking lot during daytime

好风凭借力,送我上青云

对于如今的开发者们来说,已经处在一个很好的时代了,他们拥有着丰富的基础设施,这些基础设施,让我们可以以更加低成本的方式,来构建我们自己想要的产品和工具。

我们站在巨人的肩膀之上,构建属于我们自己的产品。

为什么我们一定要完全自己去构建一个产品呢?从国家的角度来说,这样情有可原,而从个人的角度来说,借助这些基础设施来构建一款产品,才是最为实际的。

我们需要自己从 0 开始建设一个云服务么?当然没必要,我们可以使用阿里云、腾讯云、AWS、Azure,你可以使用任何一个云服务厂商为你提供的基础设施,构建自己的产品,直到他们无法满足你的那一刻。

turned on black Android smartphone

从给项目不买域名做起

我是一个灵感非常丰富的人,所以我总是会有各种奇奇怪怪的想法,并且试图将其转换为一个实体的项目(工程师的身份赋予我将其从灵感变为现实的可能,而产品经理的经历让我可以关注一个产品最为重要的是,至于说运营的工作,让我可以把一个项目从 0 开始推广)。

而我过去的一个毛病是,当我有了灵感后,会先试着去买一个域名。但,购买域名并不意味着我一定能把这个项目做完,大部分时候我会注册一个域名,然后,放一年,直到他过期。久而久之,我就有了几十个域名。。。

d2b5ca33bd970f64a6301fa75ae2eb22 7
我现在共持有 58 个域名

所以,我在思考,在后续的新的项目中,我将会启用项目代号制,先不思考项目名是什么,以及应该用什么域名,而是先尽全力将自己的 MVP 跑通,以及完成功能假设和市场假设。

所以代号从哪来呢?不妨从一些经典电影中找找灵感吧,最近看一些英文电影,然后从英文电影中寻找答案。

condenser microphone with black background

勇敢,努力的去表达自己

今天带女朋友去录制了她的第一期播客。

总体来说,她自己的体验还是不错的。虽然在去的时候,压力大,但在录制结束后,十分幸福,感受很好,也在不停的反思自己的问题。

也因为录制了第一期节目,开始期待后续的节目录制。

正如 bobo 所说,录制播客只有 0 次和无数次。

播客的制作成本远低于一篇文章、一个视频,你需要的仅仅是一个麦克风(手机的也不是不行),一个想法,以及一段属于你的时间。

这种更加简单的方式,可以让创作者们更容易、更愿意和更敢于表达自己。对于我来说是这样的,对于我女朋友来说是这样的,而对于你来说,也是这样的。

angry face illustration

不做让人不满的老人

作为年轻人,难免会在一些事情上发现老年人做的似乎并不能让你开心和如愿。但作为一个稍显懦弱(或许是犬儒)的人来说,我也很难在出现问题的那一刻站出来指证老年人。

从这个角度来看,我似乎也无法做些什么。

不过,我唯一能做的,应该就是让自己不要成为这样的人,以及不要让自己的孩子成为这样的人。

仔细想想,我觉得哪些不应该是我做的:

  1. 不插队:这是我见到的老年人最容易做的,既然我厌恶,那我也不要让别人厌恶我。
  2. 不倚老卖老:倚老卖老也是让年轻人厌恶的行为,因为将自己立在一个道德的高地之上,倘若你想做一些什么,你就是一个不尊老爱幼的人。
  3. 不以过去为荣:过去只能代表过去,而我们关注的,只有未来,我们也应该只关注未来。

后续如果想到别的我觉得应该不做的事情,继续更新这篇文章。

person working on blue and white paper on board

关注体验,而不是关注效率

今天和我的广告主,芦笋的创始人晓力聊了很多,其中聊到独立开发者的工作,我提到了一个概念:

作为独立开发者,我们需要关注产品的体验,而不是关注产品的效率。因为在效率的追求上,我们一定不如大公司能够在这个事情上做的更好,在这种情况下,做一个更具备“个人特色”的事情,会让我们在一件事上走的更远。

个人特色意味着独特的品味和体验,这种独特的品味和体验,将会引导用户持续使用。而这些独特的品味和体验,将会是留下我们的用户的重要的部分。

aerial view of city buildings beside body of water during daytime

Ship It! Ship It!

我最大的弱点,其实是交付。

还在大学的时候,得益于超出同龄人更早的接触电脑和自身的热爱,我可以在一件事上比其他人做的更快,做的更好,但随着时间的流逝,社会对于我的预期已然不同。

过去希望你能攻坚,如今希望你能制胜。

而我一直都有个问题:在交付上很弱。

仔细回想,我如今交付比较好的,大多是一些短时间就可以解决的项目,只需要不多的时间,一口气就搞完的事情,我大多可以很好的做完,而对于一些相对需要耗时更长的事情,我就会陷入无法完成交付的困境。

今天下午,女朋友问我,“你是不是最近又有什么重要的事情要做?看你最近沉迷游戏无法自拔,感觉你又是拖延症犯了“。

我当然明白,我有很多重要的事情要做。但确实,我也很焦虑,焦虑让我开始陷入了拖延的困境,事情被一拖再拖,最终,Boom!炸开。

拖延症让朋友们对我失望,希望新的一年,可以更好的交付一些东西,成就更好的自己。