本篇文章聊聊,如何将这个持续诞生和维护了 21 年的开源软件“脱离数据库”运行,让它能够更加轻量、适合低成本离线运行。
写在前面
2003 年,Michel Valdrighi 基于 b2/cafelog 创建了开源软件 WordPress,并在 GPL 协议下发布。
随后的二十年里,WordPress 一路狂奔,逐渐变成了全球使用量最大的 CMS,一边是老用户吐槽的过于臃肿的 “口诛笔伐”,一边是用户量的不断攀升,在 WordPress 插件市场中出现过非常多关于性能和成本优化的方案。
使用 SQLite 替代 WordPress 默认使用的 MySQL 就是其中不可不提的方案。
- 自 2009 年开始,社区用户 Justin Adie 就推出了能够替代 MySQL 的 PDO (SQLite) For WordPress,支持了 2.x 版本的 WordPress。
- 2013 年开始,社区用户 Kojima Toshiyasu 推出了上面程序的改进版本,能够支持 3.x ~ 4.1 版本的 WordPress。
- 随后 WordPress 使用的 PHP 版本进行了漫长的切换和升级,社区中许多的插件想要正确使用,都需要一些额外的工作,而这个时候,上面这些插件的作者或许是早已不再使用 WordPress ,所以插件的更新就停在了十年前,直到 2018~2019 年,WordPress 社区因为“插件和本体不兼容”的原因,批量禁用了这些插件的下载。
- 在 2022 年 9 月,官方发布了一篇有趣的文章 Let’s make WordPress officially support SQLite,由官方支持的 SQLite 数据库替代方案有了相对稳定的保障。
不过,目前官方还未提供开箱即用的 SQLite 容器镜像,甚至在项目中也没有安装使用方案,所以我花了一些时间,折腾了一个开箱即用的开源项目,基于官方镜像,进行 SQLite 集成,让我们能够在本地脱离“MySQL / MariaDB 数据库” 来运行 WordPress。
项目代码开源在 soulteary/docker-sqlite-wordpress,欢迎自取和一键三连。
使用 SQLite 运行 WordPress 的意义
在这个地球上,不论你想创建一个大或者小一些的网站,简洁或复杂一些的网站,WordPress 都能够满足你。目前公开的市场份额统计中,WordPress 占据了网站市场的 43.3%,CMS 市场的 62.8%,大概有 4.72 亿个站点基于它运行。
常见的网站类型包含:
- 单页登陆网站
- 很少更新的,寥寥几页的公司网站。(带有管理功能的“静态站点”)
- 简单的用户博客
- 复杂的新闻网站
- 电子商务网站
- 成熟的 CMS 解决方案
不论 WordPress 的使用场景如何变化、受欢迎程度如何变化,唯一不变的是这些网站总是要使用 MySQL、MariaDB 这类数据库来进行数据存储。这个“限制”让 WordPress 必须运行在一些资源相对充盈的环境。
但其实如果你只有几千个用户、几千个帖子,并不需要使用 MySQL 或者 MariaDB,使用 SQLite 可以让运行资源要求降低到在手机或者路由器中运行你的网站。
之所以选择 SQLite ,因为它是一个几乎完美的选择:
- 它是全球使用最广泛的数据库,并且是跨平台的,不论是在各种 PC、服务端程序,还是在你的手机应用中。
- 默认情况下,它被包含在所有的 PHP 构建中。除非你在构建的使用明确禁用它。
- 使用它可以让 WordPress 能够脱离 MySQL / MariaDB 运行在纯粹的 PHP 运行环境中,降低服务端托管成本、能源消耗和性能成本。
让我们简单来了解下它的原理和当前方案面临的问题吧。
原理和问题
想要在 WordPress 中使用 SQLite 作为数据存储后端并不复杂,目前所有的实践几乎都是使用“插件”搭配 wp-content/db.php
这个方式,来替换内置的数据库抽象层,经过大量的测试验证,这个方法是可行的。
不过,或许 WordPress SQLite 支持应该在 WordPress Core 核心支持中,而非插件中,因为数据库选择应该是首次安装站点时去确定的事情,不应该在事后完成,额外的数据库迁移动作还是非常麻烦的。
所以,官方推出了开源项目 WordPress/sqlite-database-integration,虽然目前的使用方式还是插件模式,但是后续随着完整的语法兼容(SQLite 和 MySQL 对齐),完整的应用测试覆盖后,会被直接应用到 WordPress 主干也是非常有可能的。
快速上手实践
为了解决上面插件“首次安装 WordPress不能使用 SQLite”,避免我们在“传统 WordPress 安装后迁移数据”这类麻烦事,以及,为了避免和社区里已经存在的各种三方版本的长时间的维护问题。
我创建了一个 GitHub 开源项目 soulteary/docker-sqlite-wordpress:
- 基于 WordPress 官方 Docker 镜像构建,做加法,跟着官方走,而不是自己维护 WordPress 的镜像,更可靠,维护成本也更低
- 基于 GitHub Action,来进行干净、透明的构建,避免黑箱操作,每个人都能够放心的使用,不用担心有“中间人”
使用方法很简单,我们可以使用下面的方法来下载镜像:
# 下载最新版本的镜像
docker pull soulteary/sqlite-wordpress
# 下载指定版本
docker pull soulteary/sqlite-wordpress:6.5.2
然后使用下面的命令来运行一个开箱即用,不需要 MySQL 这类数据库的 WordPress:
docker run --rm -it -p 8080:80 -v `pwd`/wordpress:/var/www/html soulteary/sqlite-wordpress
然后,我们打开浏览器,访问 http://localhost:8080
就能够开始著名的 “1 分钟安装” 流程,来完成网站的初始化,开始安装插件、主题,撰写你的文章内容啦。
当然,如果你是“声明式”爱好者,我们也可以使用下面的容器配置文件:
version: '3'
services:
wordpress:
image: soulteary/sqlite-wordpress:6.5.2
restart: always
ports:
- 8080:80
volumes:
- ./wordpress:/var/www/html
看起来是不是和 WordPress 官方推荐的配置类似,但是更简单呢?将上面的内容保存为 docker-compose.yml
,然后执行 docker compose up -d
就能够在浏览器开始你的 WordPress 之旅啦。
得益于 SQLite 的低资源消耗和高效率,我们不论是打开后台、还是网站界面,速度都会非常的快。
其他:性能相关
由于 PHP 的类 “Serverless” 运行机制,除了一些“缓存”相关的资源使用外,我们可以使用非常少的资源来跑 WordPress 程序。绝大多数的程序使用资源会在你的页面渲染结束后被释放回操作系统,让其他应用来使用。
如果我们使用 docker stats
来查看系统资源使用,在闲置的时候,CPU 使用率普遍是 0.1% ~ 1%,内存消耗则在 80MB~200MB。在当前硬件资源情况下,提供丰富软件功能生态的 WordPress,或许显得还挺划算的。
最后
本篇文章就先写到这里,下一篇文章里,我们深入聊聊最佳实践。这里有很多好玩的地方,比如:
- 你可以把它当作 AI 应用流程中获取固定内容的“Bucket”,玩过 RAG 的同学是不是很熟悉。
- 你可以把它当作一个多人协作的内容发布中心,在确定终稿后,大家再发布到各种内容平台中。
- 你可以把它当作一个配置中心,用来控制其他程序的行为。
- 你甚至可以拿它当作一个带管理界面的图床。
–EOF