WordPress 使用 SQLite 数据库

之前写了一半的,如何在轻量级个人 VPS 上搭建各种服务的帖子。一时懒得去把坑填完了。但前几天突然发现自己落入了思维误区:为了配合 Mastodon 或 Pleroma,总想着如何把 WordPress 从 MySQL 迁移到 PostgreSQL。——但是,其实完全可以用 SQLite 啊!对于偶尔才更新一篇的个人 blog 用户,把数据库放在一个 SQLite 文件里,不需要另外安装数据库服务,完全是可行的。

用 Docker 观察内存开销。对于新建的 wordpress 站点,wordpress 本身(包括 php-fpm、nginx)占用内存大约是 40-100M(使用缓存插件后会减少);MySQL 数据库占用内存 200M,随着渐渐使用,有着近千篇文章和评论的 blog 站点,MySQL 占用内存会达到 500M 甚至更多。 ——数据库的这部分内存,使用 SQLite 后,完全是可以省下的。

可以通过 SQLite Integration 插件,安装基于 SQLite 的 WordPress。Wordpress 官网的插件页面,因为作者失联而停更。但隐藏的插件下载链接,一直都还有效:

https://downloads.wordpress.org/plugin/sqlite-integration.1.8.1.zip

最新版本的 WordPress 也仍然可用。Github 上也有这个插件的分支

使用非常简单,就是把 db.php 复制到 wp-content 目录里,同时确保你的系统安装了 php-sqlite3 模块。这里有篇攻略。现有的站点,可以通过 Duplicator 之类的 wordpress 备份插件,或者 wordpress 自身的导入导出功能,进行迁移,不需要进行数据库级别的转换操作。

注意事项:

1. 最重要的,数据库的文件的存放位置,这个一定要改!默认的数据库位置是在 wp-content/database/.ht.sqlite,是会被人通过浏览器从 http://website/wp-content/database/.ht.sqlite 直接下载的!虽然插件在 database 文件里添加了 .htaccess 权限控制,但对于如今大家用的 Nginx,是默认无效的。

在 wp-config.php 里添加设置:

define('DB_DIR', '/absolute/custom/path/to/directory/for/sqlite/database/file/');
define('DB_FILE', 'custom_filename_for_sqlite_database');

可以更改数据库文件的存放位置。强烈建议把数据库文件,放到无法直接用网址从外部访问的目录(记得给那个文件夹授权可写)。

2. SQLite 不适合多线程的高并发使用。如果网站会有多个用户同时在后台编辑,那么网站不适合使用 SQLlite;如果只有一个写作者自己编辑 blog,就很合适。但要避免使用那些,在一般访客浏览网站时,也会导致对数据库进行写入的插件,如:

  • WP Statistics 这样的访客统计插件,会把来访者的每一次点击,都记录到本机数据库里。建议使用 Google Analysis 之类的外置统计软件(Google 给 wordpress 做了个官方插件 Site Kit by Google),通过在页面嵌入 js ,发送访客数据到 Google 服务器,不会写入本地数据库。
  • 官方的防垃圾评论插件 Akismet Anti-Spam,其实也是先把每条评论写入本地数据库,再判断是否垃圾的。如果被机器人大量发送垃圾评论,也会造成数据库写入的压力。建议使用 WP Captcha 之类的验证码插件(可以单独使用或配合 Akismet 一起用),把大多数垃圾评论在写入数据库之前就过滤掉。

3. 使用 WP Super Cache 插件,为网站生成缓存文件,可以极大地减少对数据库的读取操作。个人用户完全可以在插件设置里,关闭默认的 Garbage Collection 功能。


网上搜到的 WordPress + SQLite 的 docker images(12),Wordpress 和 php 的版本都有些过时了,本身也有一些小问题(如数据库文件夹的权限设置),建议修改 Dockerfile 然后自行编译。回头有时间我去改个试试。

WordPress 的 ActivityPub 插件

试用一下 WordPress 的 ActivityPub 插件(官网 / Github)。

主要功能,就是在 wordpress 上,建一个 Fediverse 账号,Mastodon / Pleroma / Misskey / Honk……的用户可以 follow 这个账号。新的 blog 文章发布时,这个账号会发一条嘟文,大家可以转发这条嘟文。followers 对这条嘟文的回复,会自动同步到 blog 文章的评论区。

就像我为这个 blog 建的 fedi 账号:@[email protected]

需要指出的是,并不存在 blog.fivest.one 这样一个 fediverse 实例。陌生人搜索这个账号,看不到任何历史嘟文;这个账号不能去 follow 别人,不能对别人说话,不能回复别人对自己嘟文的回复,也不能看到多少人转发点赞了自己的嘟文。——这些功能也许以后会有,但目前,这个插件所做的,只是在新 blog 发布的那一刻,向所有 follow 这个 id 的账号,push 一条嘟文。这条嘟文,在 blog 服务器上,并没有保存;而只存在于 follow 它的那些实例上,再被人转发到更多实例。

当 blog 的文章被删除时,这个插件也会通知所有的 followers,从他们的实例上删除对应的嘟文。但是就像我说过的,这个机制并不能把那些,被转发到其它实例的嘟文,也一起删除。所以,当你在 blog 按下发布按钮的一刹那,带着你所写的全部内容(或者摘要,可设置)的嘟文,就可能会永远飘在 fediverse 世界里,无从反悔。所以,写完这篇文章后,我还不确定自己是否会继续用这个插件……

所以我只是觉得这个插件运行的机制很有趣,向大家介绍一下而已。它仅仅是通过 ActivityPub 协议,和其它实例通信,而本身并没有创建实例。这个插件在 wordpress 的数据库里,甚至没有新增一个 table,而只是把 followers 的公钥,存到了 wp-options 里(我觉得这么折腾 options 表,有点过犹不及了……)。总而言之,这是个超级轻量化,在 wordpress 基础上,完全不产生多余开销的东西。

我之前吐槽过,目前所有的 Fediverse 引擎,都是用软件工程模块,匆匆拼出来的臃肿怪兽:开销巨大,数据结构不美观,依赖的技术模块未必有长久的生命力,安全性抗冲击性都很差……其实我很期待,一个单用户版的,完全没有 local 功能,支持 ActivityPub 协议的引擎。结构的简洁程度,和资源的开销,要比现在这些要好很多。从这个插件可见一斑(虽然这个插件和完整的个人版 fedi 实例,是完全两回事……


测试了一下。好像只有 follower 的回复(公开 or 私密)才会同步到 blog 的评论区;陌生人的不可以。但目前还没有做 follow 的审核通过机制。所以理论上是可以用这个功能发垃圾评论……

以及目前还没有让用户修改个人简介的功能,图片上那些简介,都是我在插件 templates/author-json.php 里手动改代码的。

个人 VPS 上的服务安装(未完稿)

这篇文章要讨论的是,如何在一台轻量级的 VPS 服务器上,基于自己的域名,同时安装如今各种流行,去中心化的网络服务:

  • 个人博客:Wordpress
  • ActivityPub 社交网络:Pleroma 或 Mastodon
  • Matrix 聊天服务器:Synapse 或 Dendrite
  • 个人网盘和在线办公套件:Nextcloud

然而,原本我一直在用 Linode 每月 5 美元,1C1G(1个CPU,1G内存)的服务器,打算安装的服务,也是基于这个级别的配置。然而弄到一半,突然被乔乔推荐了 Contabo 每月 5 欧元(要一次缴一年,不然有额外费用),4C8G 的服务器。虽然实际速度和网速,并不比 Linode 或 Vultr 好多少,但 8G 内存,选择各种服务的余地可就大多了。所以我整理出来的 1C1G 方案,自己并没有在用……原因我后面会说。

之前也犹豫,既然同样价钱都能 4C8G 了,那为啥还要写 1C1G 的方案?很快大家的配置也都会变高级了吧?但想想也未必,还是整理一下吧。


这篇文章讨论如何在轻量级服务器里塞进各种服务。——前提是这台服务器,假定只会有你一个人在用,最多加上你的闺蜜和男朋友。我并不知道几十个用户的 Mastodon 会有怎样的开销,至少在 1C1G 上这样做非常不靠谱。我所面向的,只是两三个好友自用的私人 VPS 而已。

这篇文章不是写给小白用户的。整个系统还是很复杂的。指望有一个教程,或者一个 docker-compose,能够让完全不懂 Linux 的用户,通过逐行复制命令,就能搞定所有的安装,目前还不现实。你至少要有在完全理解的基础上,用 LNMP 搭出 Wordpress 的能力。所以我也没必要把用过的每一条命令,都放在这篇文章里。——对于每一项服务,我会尽量给出相关靠谱攻略的链接,并且讨论一下里面的坑,和我个人所作的选择。

所以,其实这篇文章本质上就一句话:

是的,这些服务都可以装到一台机器上,不冲突。我弄过了,没问题,你们放心慢慢弄吧。


安装环境:一台 1C1G(或更好的) VPS 服务器,一个你自己的域名。

Continue reading

我为什么来推特

突然大家在回忆这个,于是也整理一下。

其实是先有 blog 再有 twitter 的。

2007年,在某个国内 blog 网站(好像是已经倒闭的 blogcn),看到个功能:在首页更新自己的一句话状态,类似于 QQ 签名档的样子。于是也想在自己的 wordpress 上面搞一个。研究了一圈,发现与其在 wordpress 上写代码,不如去注册 twitter,然后把最新的 twitter 信息同步过来。

当时有个叫做 twitter tools 的 wordpress 插件,可以定时把自己最新的推,存储到 wordpress 的数据库里,然后就可以本地调用,用纯文本的格式显示在首页上。——比 twitter 官方,以及各家山寨们,用 JavaScript 或者嵌入 frame 的方式显示,要清爽很多。这可能也是当时为什么没有首先用饭否、叽歪,等山寨货的原因。

后来还自己写了个插件,把存下来的推,每个月合成一篇 blog 文章。再后来 twitter API 改版,twitter tools 的插件也就不能用了。而 JavaScript 或者 frame 的方式,墙内的访问者是看不到的,反而会影响网页加载,也就没法用。(同样的道理 Google Analytics 也不好用)。一直想自己再写一个,基于新的 API 或者 RSS 把推同步到本地的插件的,但始终没有弄。

所以对我而言,注册 twitter 最初仍然只是自说自话的另一种方式,和 social 完全没关系。

[wordpress plugin] FS Hide Time

朋友,你是否从牙牙学语的时候,就开始坚持写自己的blog?十年浩劫中,你的服务器是否幸运地未受影响,从而把所有旧时文字都保留下来,并且成功地移植到了wordpress上?然后时隔多年回头看去,会觉得那些文字很傻很天真,傻丫得简直不配和现在的你,共存在同一个blog系统,但就这么删了又有些舍不得?又或者当你被生活已经恶心成另一个人后,就只能坐在电脑前羡慕地翻看着那个鲜活的不是你的你,刹那芳华红颜弹指,至少那些文字中不时流出的和前男友的巫山云雨,总要藏起来只有自己看到才好。
用我的插件吧。
这个插件可以把你指定时间之前的blog文章设成隐藏(private),或者自动把xxx天前的blog文章设成隐藏。
1. 本插件只对【文章(post)】进行操作,【页面(page)】不受影响。
2. 本插件只对类型为【已发布(publish)】和【私有(private)】的文章进行操作,类型为【密码保护】的文章不受影响。
3. 在隐藏以前的文章时,那些之前就已经单独设置为私有类型的文章,本插件会将其记住,确保以后批量取消隐藏时,不会将其一起公开。
4. 本插件是通过把文章设成【私有(private)】来实现隐藏的,因此基本只对单用户blog好用。如果wordpress中存在多个admin用户,或者专门进行了其它的权限设置,则不保证你的私有文章不会被别人看到。
Plugin Name: FS Hide Time
Version: 0.8
Author: fivestone
Requires at least: 2.7
Tested up to: 2.9
[download id=”8″]
== Description ==
This plugin can batch hide the articles posted before some date, or automatically keep hiding the articles posted several days ago.
1. The hide operation only affects on posts, but not on pages.
2. The plugin only changes the posts with the visibility “public” and “private”. It does not touch the “password protected” ones.
3. The plugin can remember the posts which you already set as private before, to make sure they won’t be changed into public when you cancel the hiding plugin.
4. This plugin hides posts by setting them to private visibility. If there were other admin users or some extra permission setting in you wordpress, maybe you private articles are still visible to someone else.
== Installation ==
1. Upload the directory “fs-hide-time” to the “/wp-content/plugins/” directory
2. Activate the plugin through the ‘Plugins’ menu in WordPress
3. In menu “Setting -> FS Hide Time”, generate the digests manually.
== Screenshots ==

WordPress中的标点符号转换 – 2

以前提到过 wordpress 会把诸如 “–” 之类的符号自动替换成 “—” 等全角字符,解决方法是在 formatting.php 中修改 wptexturize() 函数,但这样子修改,每次wordpress升级都会被覆盖。于是就想写个插件解决。但用插件的话就只能把整个 wptexturize() 都禁用掉。这个函数的其它部分是一堆转义代码,一时看不懂什么意思,担心禁掉后会不会被人在留言里用script渗透。就放在一边一直没有弄。刚刚看了看,应该和script没关系,可以完全禁掉的。
然后发现早在07年,就有先贤写过一个只有三行的叫做 Disable wptexturize 的插件,用来禁掉这个函数。但是….为什么这个插件也叫做wptexturize?也就是说只有已经知道了这个函数的存在的人,才能够搜索到这个插件,而通过其它如 “disable auto format / convert” 之类的关键字,基本上是搜不到的。
程续缘真是可悲的物种啊。

[wordpress plugin] FS Twitter Digest

a: 你blog顶上那个状态是怎么弄的啊?
f: twitter-tools,把我发在twitter的状态同步到blog。
a: 。。twitter。。。。如果不用twitter。。你推荐什么呢?
f: 那你打算在哪里写你的状态呢?
a: 我的blog亚。。
f: twitter-tools,你可以在blog后台写了让它发到twitter再同步回来…反正你如今从海外服务器连twitter不用翻墙了。
嗯,恭喜a伉俪网站成功翻墙以及双双告别cn生涯~~ 用twitter-tools显示状态的时候,可以在边栏使用插件自带的widget,也可以编辑后台主题,在你想要显示的地方写上

<?php aktt_latest_tweet(); ?>

话说twitter-tools有个功能,可以自动把你每天/每周发的tweet整理成一篇文章发到blog上。但每天/每周这个频率太夸张了,乃至自己正常的blog文章会完全淹没在这种话痨帖里,所以很多人用了这个功能没几周就受不了又关掉了。后来我把twitter-tools修改了一下,可以指定日期范围手动生成,然后通常每个月来一次
后来这个修改版给过几个人。但我当时是在Twitter-tools 1.0的代码里修改的,如今都2.2了(虽然没觉得添加了什么功能……),一直不方便升级。刚刚又弄了一番,把那段修改的代码拿出来,作为一个独立的插件,和twitter-tools分离开。
用这个插件的前提:
1. 你wordpress所在的服务器可以访问twitter;(如今还有在墙内活着的个人wordpress么?)
2. 你在用Twitter-tools
生成的整理帖,其中的作者、分类、标签,都根据twitter-tools里的设置自动生成。除了题目和日期外,和twitter-tools生成的格式完全没区别。我自己用的时候,把twitter的输出格式稍微改了一下,这个功能也放在插件里了。你可以在程序第61行把调用函数改成fis_gene_digest(),然后到那个函数里去手动改输出格式。
a同学的想法还是要赞一下的。因为我当年开始用twitter,就是之前看到某博客网站有个可以自己写一句话显示在页面顶部的功能,觉得不错,也想在wordpress里写一个,后来研究了一下才决定用twitter来辗转实现的。个么我的twitter主要还是用来写自己的琐碎,对那些号称要多@别人参与讨论的说法,从来都是无视。别人@给我的,其中聊天性质的也不大想re。我的twitter信息同步到了很多其它网站。大家更多的是在friendfeedgoogle buzz上讨论,个人更喜欢friendfeed一些。
Plugin Name: FS Twitter Digest
Version: 0.8
Author: fivestone
Requires at least: 2.7
Tested up to: 2.9
[download id=”7″]
== Description ==
As a patch to Twitter-tools, this plugin help users post the twitter digest bwtween the manual dates.
The digests use catalog and tag info as what you set in Twitter-Tools interface. It’s all the same as the “Create a daily/weekly digest” function in Twitter-tools, except the title and the date.
If you are a coder and wish to customize the format in the digest, you can change the code at Line 61, and design your own output in the function fis_gene_digest().
This patch was tested successfully under the Twitter-tools version 1.0 – 2.2.1
== Installation ==
1. Ensure you are using the Twitter-tools plugin.
2. Upload the directory “fis-twitter-digest” to the “/wp-content/plugins/” directory
3. Activate the plugin through the ‘Plugins’ menu in WordPress
4. In menu “Setting -> FS Twitter Digest”, generate the digests manually.
== Screenshots ==

[wordpress plugin] Disable Comment RSS

Plugin Name: Disable Comment RSS
Plugin URI: http://code.google.com/p/wp-disable-comment-rss/
Blog URI: http://blog.fivest.one/archives/664
Description: Disable RSS of posts or comments separately
Version: 0.8
Author: fivestone
download link
== Description ==
User can choose to disable the RSS for the posts or the comments, or both of them.
Background:
I am using the plugin “Whisper” to make some comments invisible, but they still appear
in the comments RSS. Then I want to disable the comments RSS while keeping the post
RSS valid. There seemed no proper plugin for it, so I write this one.
== Installation ==
1. Upload the directory “disable-comment-rss” to the “/wp-content/plugins/” directory
2. Activate the plugin through the ‘Plugins’ menu in WordPress
3. In menu “Setting -> Disable Comment RSS”, choose the RSS which you want to disable.
== Screenshots ==

—————————————-
第一次写 wordpress 插件,练练手~~
功能很简单:禁用RSS。上次装了留言悄悄话插件后,一直在找有什么插件能把评论的RSS禁掉,但网上能找到的都是连文章RSS一起禁的,手动改代码又不方便自动升级。不能忍了干脆自己写一个玩,可以在菜单里选择你要禁用文章的RSS还是评论的RSS。
Version 0.8 公测。大家试试哈。过几天稳定的话,改成1.0提交到官网去。我一直以为所谓 wordpress 用户就是 wordpress.com 上的用户,原来不是。。。wordpress.org的fivestone居然被人注册掉了,这个是用来定义作者署名的啊呜呜呜。

WordPress 的文章收藏插件

某人问起有些blog文章后面那些收藏的按钮怎么弄啊,正好我从上次删掉ShareThis后也一直想再弄个类似的玩玩。网上转了一圈,相关的wordpress插件很多,但大部分(如ShareThis、AddThis、add-to-any、以及我爱水煮鱼的国内精品17fav)都是把主程序建在他们自己的服务器上,在blog里插入一段js,访问它家的服务器,才能中转到进行收藏的网站。
实在搞不懂他们为什么要用这样的架构。每次收藏都访问服务器,大大增加了页面读取的时间,甚至当读者网络不畅(如教育网不能访问ShareThis)以及某些不靠谱的时候,会发生完全不能使用的情况。最不爽的是用户只能在网站提供的那些收藏站点间进行选择,不能自行添加要收藏的地址。而那些插件的提供者也不大可能牛x到要网站们过来给钱求着,才给你添加收藏按钮的程度。个么除了能够享受PR激增的快感外,看不出有这样做的必要。这样的插件,完全可以纯在本机运行。
于是找到了Sociable,完全在本机运行的收藏插件。界面看着也比较清爽,用户可以在列表中选择要显示在页面上的收藏按钮,调整其先后顺序。也可以通过编辑插件的php文件,比较轻松地增加通往新的收藏站点的按钮(如果能在后台界面中管理就更好了)。试着编辑了一下,添加了下列网站的收藏按钮:

Google Reader、豆瓣、九点、校内、开心、嘀咕、饭否、QQ书签、百度搜藏

后面几个服务我从来没用过,甚至觉得显示到它家的收藏按钮会降低本blog的品味 @[email protected] 但既然是大势所趋,也就无妨顺手加到后台列表里面,大家可以按口味选择。
另外,因为 Google Reader 的Note in Reader功能只能对当前页面的地址起作用,不能在blog首页的文章列表中获取单独某一篇的url,所以专门对此类网站添加了singleonly属性,只有单篇blog页面下,按钮才会显示:

if ( true == $site[‘singleonly’] && !is_single() ) continue;

Google Reader的图标和Google Mark的图标重复了,看着不舒服,大家有什么建议么?
调整了一下显示页面,使title和图标在同一行显示:

// $html .= “<div class=\”sociable_tagline\”>\n”;
$html .= stripslashes($tagline);
// $html .= “\n</div>”;

修改后的插件在这里提供下载:
[download id=”4″]
如果需要新的收藏按钮又自己懒得动手的,可以在留言里提出,我会酌情添加进去。