WordPress 告别 MySQL:Docker SQLite WordPress

本篇文章聊聊,如何将这个持续诞生和维护了 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.2restart: alwaysports:- 8080:80volumes:- ./wordpress:/var/www/html

看起来是不是和 WordPress 官方推荐的配置类似,但是更简单呢?将上面的内容保存为 docker-compose.yml ,然后执行 docker compose up -d 就能够在浏览器开始你的 WordPress 之旅啦。

WordPress 新版本后台

得益于 SQLite 的低资源消耗和高效率,我们不论是打开后台、还是网站界面,速度都会非常的快。

WordPress 2024 网站主题

其他:性能相关

由于 PHP 的类 “Serverless” 运行机制,除了一些“缓存”相关的资源使用外,我们可以使用非常少的资源来跑 WordPress 程序。绝大多数的程序使用资源会在你的页面渲染结束后被释放回操作系统,让其他应用来使用。

如果我们使用 docker stats 来查看系统资源使用,在闲置的时候,CPU 使用率普遍是 0.1% ~ 1%,内存消耗则在 80MB~200MB。在当前硬件资源情况下,提供丰富软件功能生态的 WordPress,或许显得还挺划算的。

最后

本篇文章就先写到这里,下一篇文章里,我们深入聊聊最佳实践。这里有很多好玩的地方,比如:

  • 你可以把它当作 AI 应用流程中获取固定内容的“Bucket”,玩过 RAG 的同学是不是很熟悉。
  • 你可以把它当作一个多人协作的内容发布中心,在确定终稿后,大家再发布到各种内容平台中。
  • 你可以把它当作一个配置中心,用来控制其他程序的行为。
  • 你甚至可以拿它当作一个带管理界面的图床。

–EOF


我们有一个小小的折腾群,里面聚集了一些喜欢折腾、彼此坦诚相待的小伙伴。

我们在里面会一起聊聊软硬件、HomeLab、编程上、生活里以及职场中的一些问题,偶尔也在群里不定期的分享一些技术资料。

关于交友的标准,请参考下面的文章:

苏洋:致新朋友:为生活投票,不断寻找更好的朋友

当然,通过下面这篇文章添加好友时,请备注实名和公司或学校、注明来源和目的,珍惜彼此的时间 😄

苏洋:关于折腾群入群的那些事


本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 2024年04月17日
统计字数: 4088字
阅读时间: 9分钟阅读
本文链接: https://soulteary.com/2024/04/17/say-goodbye-to-mysql-docker-sqlite-wordpress.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/1824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(一)Java EE企业级应用开发实战之Servlet教程——JDK安装

首先打开清华大学开源软件镜像站,清华大学开源镜像网站地址为: https://mirrors.tuna.tsinghua.edu.cn/ 打开该地址后的界面显示如下图所示 找到8版本对应的SDK安装包,我现在用的开发机器是Windows,所以我找的是Windows对应的版本…

weblogic怎么配置控制台日志输出路径

要在WebLogic Server中配置控制台日志(Server Log)的输出路径,请按照以下步骤操作: 通过WebLogic管理控制台配置: 登录到WebLogic Server的管理控制台,地址通常是 http://hostname:port/console&#xff0c…

[柏鹭杯 2021]试试大数据分解?

题目:(NSSCTF | 在线CTF平台) 题目就是如此,我没看到有5个不同的文本,其中最后一个文本以pem后缀,所以我们先来了解一下什么是pem格式。 PEM 格式 PEM格式通常用于数字证书认证机构(Certifica…

EelasticSearch的介绍和基于docker安装

1.概述 Elasticsearch 是一个基于 Apache Lucene 构建的开源分布式搜索引擎和分析引擎。它专为云计算环境设计,提供了一个分布式的、高可用的实时分析和搜索平台。Elasticsearch 可以处理大量数据,并且具备横向扩展能力,能够通过增加更多的硬…

AES和RSA加解密算法学习笔记(实战版)

1. 写在前面 今天整理一篇有关密码学的学习笔记,原因是最近做的一个任务是在网络传输的时候,需要对传输的包进行加密和解密工作,以保证传输过程的安全性。所以,这个过程用到了AES和RSA两个算法。 场景:假设我要给我的老师传送毕设代码和论文, 我已经把代码和论文打成了一…

P1601 A+B Problem(高精)(高精度加法)

题目&#xff1a;AB Problem&#xff08;高精&#xff09; - 洛谷 #include<bits/stdc.h> using namespace std; const int N100010; int A[N],B[N],C[N]; int Add(int a[],int b[],int c[],int cnt){int t0; //表进位for(int i1;i<cnt;i){ta[i]b[i]; c[i]t%10; t/10…

VSCode 配置 C/C++ 环境

1 安装 VSCode 直接去官网(https://code.visualstudio.com/)下载并安装即可。 2 配置C/C编译环境 方案一 如果是在Windows&#xff0c;需要安装 MingW&#xff0c;可以去官网(https://sourceforge.net/projects/mingw-w64/)下载安装包。 注意安装路径不要出现中文。 打开 w…

C++结构体

结构体定义 三种声明方式 1 struct Student s1 2 struct Student s2{…} 3在定义结构体时&#xff0c;顺便创建结构体变量&#xff08;不建议用&#xff09; // 结构体.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream> usi…

《1w实盘and大盘基金预测 day25》

上贴整体预测还行&#xff0c;第三点、第四点完全符合&#xff0c;最低3042&#xff0c;我预测3038 昨日预测&#xff1a; 3038-3064-3074-3090 低开拉升&#xff0c;冲高回落 大盘继续震荡&#xff1f;收3074附近 中字头等股票回调&#xff1f;大跌收3038附近 科技股有继续回…

Ubuntu-18.04本地化部署Rustdesk服务器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、配置防火墙二、安装三大件1.下载三大件2.安装三大件 三、安装客户端1.下载客户端1.Windows2.Linux 四、配置客户端连接服务器五、总结 前言 如果你是想数据…

JEECG表格选中状态怎么去掉

官网代码&#xff08;在取消选中状态的时候不生效&#xff09; rowSelection() {return {onChange: (selectedRowKeys, selectedRows) > {console.log(selectedRowKeys: ${selectedRowKeys}, selectedRows: , selectedRows);},getCheckboxProps: record > ({props: {disa…

数据结构系列-堆排序

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 昨天我们实现的堆的搭建&#xff0c;我们今天实现以下堆的排序&#xff0c; 堆的排序的最大的优点就是提高的效率&#xff0c;减小了时间复杂度&#xff0c;在这个里面我们有一个…

面试十八、容器适配器

容器适配器是一种特殊类型的容器&#xff0c;它们提供了一种不同于常规容器的接口和行为。容器适配器通常是建立在其他容器之上&#xff0c;通过改变接口或添加限制来满足特定的需求或解决特定的问题。 在 C 中&#xff0c;标准库提供了三种常见的容器适配器&#xff1a; 栈&am…

Web3钱包开发获取测试币-Polygon Mumbai(一)

Web3钱包开发获取测试币-Polygon Mumbai(一) 由于主网区块链上的智能合约需要真正的代币&#xff0c;而部署和使用需要花费真金白银&#xff0c;因此测试网络为 Web3 开发人员提供了一个测试环境&#xff0c;用于部署和测试他们的智能合约&#xff0c;以识别和修复在将智能合约…

边缘渲染是什么意思?属于云渲染吗?

边缘渲染&#xff0c;即利用靠近数据源或用户的边缘计算资源进行渲染&#xff0c;以减少数据传输延迟并提升处理速度。这种方式虽然基于云技术&#xff0c;但更注重数据处理的地理位置优化&#xff0c;与传统的云渲染有所不同。 一、边缘渲染属于什么意思? 边缘渲染是一种基于…

周鸿祎和雷军、马化腾相逢一笑泯恩仇

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 马云竟然没有到场&#xff0c;真是遗憾! 前两天工信部和互联网协会联合举办的中国互联网三十周年座谈会上。周鸿祎、雷军、马化腾相逢一笑泯恩仇。 第一条视频&#xff1a; 周鸿祎和马化腾握手言欢&#xff0c…

一道有意思的面试题

面试过程中没有想到合适的数据结构&#xff0c;想了半天&#xff0c;构思没有实践落地。 也是听错了&#xff0c;以为三道题都要做&#xff0c;做出来了两道&#xff0c;这道死活没落地成功。 结果&#xff0c;三道题里面任选一道就行。。。。 好吧 题目&#xff1a;给定一个…

将组件 赋值给变量li 想拿到 组件的html页面结构 但是 打印出来的是 文件路径 该如何实现呢?

需求 import { ref } from vue; import refrigerationRight from /views/bim3D/components/right/refrigerationRight.vue const liref({lis:refrigerationRight }) const refrigerationclick()>{console.log(li) }##方法 import { createApp } from vue; import refriger…

对接浦发银行支付(八)-- 对账接口

一、背景 本文不是要讲述支付服务的对账模块具体怎么做&#xff0c;仅是介绍如何对接浦发银行的对账接口。 也就是说&#xff0c;本文限读取到对账文件的内容&#xff0c;不会进一步去讲述如何与支付平台进行对账。 如果要获取商户的对账单&#xff0c;需要遵循以下步骤&…

【从浅学到熟知Linux】进程间通信之匿名管道方式(进程间通信方式汇总、匿名管道的创建、匿名管道实现进程池详解)

&#x1f3e0;关于专栏&#xff1a;Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程等内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 进程间通信介绍如何实现进程间通信进程间通信分类 管道通信方式什么是管道匿名管道pipe匿名管道读写规则管…