经过一天的升级与四天的观察、调试,论坛已经完成升级。
原版本:PHP 5.6 + Discuz! X3.2(GBK版本),缓存采用APC,数据库字符集与排序方式为gbk_chinese_ci。
新版本:PHP 7.1 + Discuz! X3.3(UTF-8版本),缓存采用APCu,数据库字符集与排序方式为utf8mb4_general_ci,引擎为InnoDB。
另外,我们也顺便把首页和应用中心也一并升级到了PHP 7.1。现在Z-Blog全线服务均已升级到PHP 7.1。
如果发现我们的论坛或任何设施存在问题,欢迎在论坛或本博客下反馈,我们将尽快修复。
现在我们发现存在以下问题,一些已反馈给Discuz!官方,一些已自行解决并提交Pull Request,希望他们能够合并:
1. 在PHP 7.1下存在Warning:http://www.discuz.net/thread-3800026-1-1.html
2. (已合并)在PHP 7.1下防水墙的Bug:http://git.oschina.net/ComsenzDiscuz/DiscuzX/pulls/31
3. (已加入)PHP 7的APCu支持(替代APC):http://git.oschina.net/ComsenzDiscuz/DiscuzX/pulls/32
也给大家分享一下升级与转换过程与可能踩到的坑:
因为有腾讯云 CDB 备份的存在,我们关闭论坛后,直接使用
alter database `数据库名` default charset utf8mb4 default collate utf8mb4_general_ci; alter table `表名(有三百多个,请自行处理)` default charset utf8mb4 collate utf8mb4_general_ci;
数据库要转成utf8mb4
的话,不要使用utf8mb4_bin
和utf8mb4_unicode_ci
。前者区分大小写,后者把相同字符的全角与半角视为同个字符,对username已存在数据的网站无法处理。另外,utf8mb4
和相当多的插件都有兼容性问题,一般用户把上面的utf8mb4
改为utf8
,utf8mb4_general_ci
改为utf8_general_ci
。
如要把数据库从GBK转换到了utf8mb4。这期间有一部分表转换会出现问题,需要把这些表的索引类型varchar(255)
改为varchar(190)
。如果使用utf8_general_ci
则不需要考虑这一步。
数据库更改完成后,因为我们是 GBK 转 UTF-8,所以对 pre_common_setting
、pre_common_plugin
、pre_forum_groupfield
等表,需要把里面的内容再次转换。我们是将其dump出sql,然后执行以下Nodejs脚本:
/** * Created by zsx (https://www.zsxsoft.com) (2017-1-29) * Used for Z-BlogPHP BBS (https://www.zblogcn.com) * WTFPL, but do not remove this copyright information. * @engine node > 4.0 */ const fs = require('fs') const cp = require('child_process') const data = fs.readFileSync('C:\\Users\\sx\\Downloads\\pre_common_setting (1).sql').toString() const reg = /s:([1-9]\d*?):"(.*?[^\\\\]"|[^\\\\](\\\\\\\\)+")/g const utf8Length = str => { const m = encodeURIComponent(str).match(/%[89ABab]/g) return str.length + (m ? m.length : 0) - 1 } const newData = data.replace(/CREATE TABLE `(.*?)`/g, "DROP TABLE `$1`; CREATE TABLE `$1`").replace(reg, (org, s1, s2) => `s:${utf8Length(s2)}:"${s2}`) fs.writeFileSync('Z:\\pre_common_setting.sql', newData, 'utf-8') cp.exec('notepad Z:\\pre_common_setting.sql')
Discuz!论坛大量依赖serialize函数,其在GBK和UTF-8下的表现不同。本脚本正是为了将这些不同转化,如若不转,个人资料、评分等会受到影响。
最后直接上传Discuz! X3.3 UTF-8版本,修改config/config_global.php配置即可使用。3.2转3.3不需要升级脚本。
(最新版本已经支持)接着,我们需要让Discuz支持APCu,参照此Commit,修改Discuz文件即可:http://git.oschina.net/ComsenzDiscuz/DiscuzX/commit/199c64db59eb6f75dfaa177887013ef1df7d8cfe
最后吐槽:
这个论坛还真是各种意义上的有年头(08年DZ6.0升DZ7.0:https://blog.zblogcn.com/2008/12/23/57/ )……