前言
上次更新时间为:2023年3月7日00:59:45
本次更新时间为:2023年9月12日05:47:39
当前版本为:0.0.2
1.WordPress运行流程
既然我们需要优化WordPress(下面简称WP),我们就要先去了解WP的工作流程,这样才能根据我们的需求以及实际的应用场景来进行专注的优化。
1.1文章和数据库的关系
当我们进入某个网站时,最先出现的肯定是个集合了很多文章的页面。
我们先排除 我所标注出来 的1、2、3部分的因为他们不涉及我们此次课程的计划。
现在我们看的出来网站中最重要的部分,文章或页面(图片中主要为文章),每一篇文章都对应这你数据库中的一张表。我们使用“字符串特点”这篇文章来做个示范。
该文章在数据库中的样式是这样的:
而我们在浏览器中经过层层渲染的文章变成了这样:
如果对古腾堡编辑器了解过一些的小伙们会发现这些嵌套的H5标签不就是每新建一个段落默认生成的吗?是滴没错,我们接下来再校队下文字 发现一模一样,那数据库中文章的图片呢?
其实这一行代码就是图片,但是数据库只会存储图片的地址,当渲染时直接访问。
所以以前有小伙伴问我说:“王总,我那个服务器到期了 网站要迁移。但是明明站点啊 数据库啊都备份了 但网站打开一看内容是有的,但是图片没有了 这啥情况啊帮帮忙!”
现在我们就知道了,数据库只存储你文章中图片对象的地址,可以理解为(url),它只是是一个指向图片的东西,你图片没有的化,他指向了个寂寞啊。
<img src="https://e-yuansu.com/wp-content/uploads/2023/03/09e731c5c0161629-800x403.png" class="wp-image-113"/>
1.2访问流程
2.优化方向
2.1页面优化
- 网页架构
- 页面静态文件分离
- 前后端分离
- 网站架构
- 静态文件内容分发网络
- 动态文件快速回源链路
- 数据库
- 数据库查询语法优化
- 数据库索引优化
- 数据库查询缓存 (Memcached or Redis)
- 数据库读写分离
- 站库分离
- 将 MySQL 更换为 PostgreSQL 或 Oracle
- 文件系统
- 站库分离
- PHP Opcode 缓存
- 网页 html 缓存
还有一个难度稍高,但收益巨大且立竿见影的方法:使用更快速的语言重写网站
2.2网页架构优化
主要说明对于网页的组成和架构的优化方案。
2.2.1动静分离
在经我之手的 WordPress 中,按下 F12 ,你可以看到这种场景。
这些站点的 Page Sources 都有一个共性,即访问的域名下只有页面文件。
将页面所引用的静态文件分离至对象存储或其他公共服务,以此提高静态文件的加载速度并减轻源站压力,这是一种可以有效提高用户体验的优化方式。
对于未备案的域名,无法使用中国大陆的服务器自然是个遗憾,大量的静态文件通过较慢的跨境网络加载也会降低用户页面渲染的速度,对于这类情况此方法也是很有效的。
你可以使用 source-global-cdn 插件将 WordPress 内核的静态文件分离,同时为 Gravatar 进行加速。
你也可以使用 Source Global CDN 服务为发布在 WordPress.org 的插件和主题加速,当然如果你的网站已经托管CDN服务就可以略过。
2.2.2前后端分离
对于 WordPress,前后端分离是很不现实的。把页面渲染交给用户可以减轻服务器压力,但自然对用户端有更大的负担。(不过通常我们不会去关心用户渲染有多慢,只会让他们换个浏览器。)
可以利用程序功能,将静态的 JavaScript/CSS 文件和数据内容分离,通过 Ajax 获取数据并渲染到页面。
2.3网路优化
2.3.1内容分发网络
CDN 通过缓存资源到边缘节点和二级节点中,降低资源回源率,让资源分布到各个节点中,以此提高访问速度和减轻源站压力。
想必诸位都听说过 某地一码通两次崩溃 的事件了,在解包小程序后可以看到其使用的静态文件并未使用 CDN(内容分发网络)而是直接提供,在 3.5 万 QPS 的访问量下单个机房的带宽出口是绝对不可能撑住的。
使用内容分发网络,不仅可以显著降低源站压力,而且可以加快访问速度,那我们又为何不用呢?
- 阿里云 CDN:全球速度较好且均有节点分布,节点数量多,国内需备案
- 腾讯云 CDN:国内速度号节点多延迟低,国外质量一般,国内需备案
- CloudFlare:国内节点需大客户,国外节点防御高,免费,速度一般,延迟一般,偶尔被运营商封,无需备案
- CloudFront:AWS 家的 CDN,送 2TB 流量,速度优,国内无节点,速度良好,延迟一般,无需备案
在上文的动静分离中,使用 对象存储 + CDN 也可以显著降低成本、提高速度、降低源站压力。
使用 腾讯云 COS + 腾讯云 CDN,可以得到一个腾讯的备案域名,这个对于无备案域名的站长是很友好的。
2.3.2动态链路优化
在广告的疯狂摧残下,想必诸位都听说过 “全站加速” 了。
它的本质意义就是让回源链路更短、更快,节点间大多使用内部协议提高响应速度,以最优的链路访问员站,以此减小动态内容的响应延迟。
我个人较为推荐 阿里云的 DCDN 和 腾讯云 CDN 的动静加速模式。
2.4PHP 优化
PHP 优化最高级的方法肯定是自己改 PHP 核心程序,如果不懂代码,请直接略过。。
2.4.1Opcode 缓存
PHP 是一个脚本语言,他会将 php 文件编译为 Opcode 后执行。部分 php 文件不需要每次都重新读取后编译,因此我们可以缓存编译后的 Opcode ,来取缔编译过程消耗的时间。
例如使用 PHP 扩展:Zend OPCache / APC。
3.数据库
3.1查询优化
在服务器渲染一个页面时通常会进行 10~20 次数据库查询。
使用 WordFence 会提高到 30 次以上,同时安全性大幅提高。
而部分的查询是不需要每次更新的,因此我们可以使用 Redis 或 Memcached 等内存缓存器将其缓存。显然,数据库查询的速度是远低于直接从内存获取数据的速度的。
我个人是有更精细的同时使用 Redis 和 Memcached 进行缓存的方法的,但属于付费服务,因此不作公布。
3.2站库分离
有时,当你打开自己的 WordPress ,发现致命错误:无法连接到数据库。然后,打开 Linux 终端,输入 service mysqld status
;然后发现,MySQL 服务关闭了。
数据库作为服务持续运行的必要条件和基础,自然不应随意关闭。而你的数据库这样关闭,大概率是因为内存溢出。
MySQL 数据库可以配置占用的资源大小,但如果资源太小会导致响应慢,太大又会导致网页高并发时内存溢出。那,怎么让站点并发大时内存占用大时不会导致数据库内存溢出呢?
我采取的方案是 站库分离 ,即将数据库从 web 服务器移出。我目前在使用阿里云 RDS 数据库和腾讯云 TDSQL-C 数据库。这可以有效降低数据库因内存溢出而关闭导致站点无法正常访问的概率。
3.3MySQL存储引擎
前面也给大家介绍了WP的工作流程,使用我们知道数据库可谓是WP的心脏,PHP则是大脑,如果没有心脏哪怕你在聪慧过人,也没有养分为你供给;但是心脏我们也分为左心室右心室等,我们不能控制心脏的某个心室单独工作,但是MySQL可以。
MySQL现在默认的引擎是InnoDB ,InnoDB 相较于较老的MyISAM引擎,其优势主要有:行级锁定;拥有参照完整性(关系约束),支持回滚;
下面我们开始讲述InnoDB 存储引擎,InnoDB 在 MySQL 5.5 之后的就是默认存储引擎,也就是说如果你的网站部署环境时MySQL版本>5.5就不需要浪费时间去配置了,如果你手动在MySQL执行命令行 CREATE TABLE 中没有指定 ENGINE 选项,默认创建的就是 InnoDB引擎,如果你的站点老旧,或者不确定自己的数据库引擎是MyISAM还是InnoDB,别着急这就来帮你解决。
3.3.1检查数据库使用的引擎
1.首先进入我们的 phpMyAdmin 登录页面,并且登录你的数据库名以及密码。
2.一般成功登录后显示的界面是这样的,此时选择与你数据库名一致的进入,information_schema 这张表是数据库的索引表,无需进入。
3.我们点击类型,页面会自动排序,就可以看到每一项独立的表使用的是什么引擎了。
3.4对修订版本进行限制
在我们每次编辑文章或者页面时,WP会自动对我们所编辑的内容进行自动保存并且创建修订版本,以便让你回顾历史记录,但不对修订版本数量加以限制那就回出现一片文章10多份修订版本的出现,会大大增加数据库表数量,造成不不要的索引次数。对于删除无需的修订版本我在此不再赘述,因为有很多插件都能实现该功能,但切记删除前先备份数据库。
我们需要使用到下面这个函数:
//限制WP生成最大 续订版本 数量,修改后面的实参 3 就可以更改数量
define('WP_POST_REVISIONS', 3);
到这里你是不是已经已经跃跃欲试了,先别急!我告诉它的位置在哪里。
我们需要先找到 wp-config.php 这个文件,wp-config.php 在你网站的根目录中可以找到,我们在 <?php 后面另起一行 复制上面的代码就行了。
暂无评论内容