菠萝阁 ZBLOGCN.COM

Z-Blog官方博客

ZBlogger社区升级成功⚡

经过一天的升级与四天的观察、调试,论坛已经完成升级。

原版本: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_binutf8mb4_unicode_ci。前者区分大小写,后者把相同字符的全角与半角视为同个字符,对username已存在数据的网站无法处理。另外,utf8mb4和相当多的插件都有兼容性问题,一般用户把上面的utf8mb4改为utf8utf8mb4_general_ci改为utf8_general_ci

    如要把数据库从GBK转换到了utf8mb4。这期间有一部分表转换会出现问题,需要把这些表的索引类型varchar(255)改为varchar(190)。如果使用utf8_general_ci则不需要考虑这一步。

    数据库更改完成后,因为我们是 GBK 转 UTF-8,所以 pre_common_settingpre_common_pluginpre_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/ )……

Powered By Z-BlogPHP 1.7.1

ZBLOGCN.COM 版权所有. 鄂ICP备19031813号-6.  由又拍云提供CDN及云存储服务