MediaWiki的1.39版终于发布了,这次趁着升级把过程重新梳理一遍。
友情提示:在升级前如果有条件的话最好给服务器云盘做个快照,万一失败还能回滚。

一、检查安装环境

1.39版和1.35版的安装环境大同小异,大致如下:

  • PHP 7.4.3+(PHP 8.0并非官方推荐,且只有1.38.4+或1.39.0+才支持)
  • MySQL 5.7.0+ 或 MariaDB 10.3.0+

所以就暂时维持原样。

二、使用Git下载MediaWiki

进入到网站的安装目录下(比如wwwroot),使用命令:

git clone https://gerrit.wikimedia.org/r/mediawiki/core.git --branch REL1_39 mediawiki

然后更新子模块,通常就是皮肤(skin)和扩展(extension)。

cd mediawiki
git submodule update --init --recursive

到这一步,基本上核心的程序已经被下载到服务器上了。

三、安装其他扩展

在《一键安装MediaWiki扩展》一文中已经提到过如何用脚本的方式安装扩展,所以升级的时候只需把脚本文件和扩展列表文件复制到mediawiki/extensions下并通过控制台运行脚本即可(记得替换代码中的版本号,文中用的是1.38版)。
脚本安装MediaWiki扩展.png
安装过程中要记得留意一下哪些扩展没有被安装(通常是没有发行对应版本)。要是官网提供手动下载的对应版本就手工上传一份,否则就在配置文件中先禁用该扩展。如果该扩展对你很重要,又实在没有对应的版本,那就可以考虑暂时不升级。

四、获取外部库

之所以把这一步放到其他扩展安装完毕之后,是担心有些扩展同样会用到外部库(基本上不太会发生),所以就一并获取了(反正早一点晚一点应该问题不大)。
回到mediawiki目录下,并在命令行中输入:

composer update --no-dev

如果有报错的话,可以参考《MediaWiki升级,composer update报错》一文。

五、复制配置文件和图片目录

既然是升级,那么配置文件和图片目录是一定要复制到新目录下的。

cp -r 原来的wiki目录/images mediawiki/
cp 原来的wiki目录/LocalSettings.php mediawiki/

注意images目录的权限问题(分配写操作)。如果还有其他的就一并复制过去,比如Logo等文件。

六、运行升级脚本

进入mediawiki/maintenance,运行php update.php命令。
如果你的扩展安装的比较少,那么有可能会一次通过,否则它会不断提示你某某扩展出错。反正该装的装,该禁用的禁用,直到扩展不报错为止。
MediaWiki升级脚本报错.png
因为没有正式启用,所以用该命令还是会报错的。
MediaWiki升级脚本报错2.png

七、网站新旧替换

到这一步基本上应该离成功不远了,剩下的就是将旧版本的目录改名,然后再将mediawiki改成旧版的目录名。
重新进入maintenance目录,再次php update.php命令。报错如下:

Adding index eps_user to table echo_push_subscription...Wikimedia\Rdbms\DBQueryError from line 1618 of /data/wwwroot/wiki.mindseed.cn/includes/libs/rdbms/database/Database.php: Error 1091: Can't DROP 'echo_push_subscription_ibfk_2'; check that column/key exists
Function: Wikimedia\Rdbms\Database::sourceFile( /data/wwwroot/wiki.mindseed.cn/extensions/Echo/sql/mysql/patch-cleanup-push_subscription-foreign-keys-indexes.sql )
Query: ALTER TABLE `echo_push_subscription` DROP FOREIGN KEY `echo_push_subscription_ibfk_2`

#0 /data/wwwroot/wiki.mindseed.cn/includes/libs/rdbms/database/Database.php(1602): Wikimedia\Rdbms\Database->getQueryException()
#1 /data/wwwroot/wiki.mindseed.cn/includes/libs/rdbms/database/Database.php(1576): Wikimedia\Rdbms\Database->getQueryExceptionAndLog()
#2 /data/wwwroot/wiki.mindseed.cn/includes/libs/rdbms/database/Database.php(952): Wikimedia\Rdbms\Database->reportQueryError()
#3 /data/wwwroot/wiki.mindseed.cn/includes/libs/rdbms/database/Database.php(3299): Wikimedia\Rdbms\Database->query()
#4 /data/wwwroot/wiki.mindseed.cn/includes/libs/rdbms/database/Database.php(3238): Wikimedia\Rdbms\Database->sourceStream()
#5 /data/wwwroot/wiki.mindseed.cn/includes/libs/rdbms/database/DBConnRef.php(103): Wikimedia\Rdbms\Database->sourceFile()
#6 /data/wwwroot/wiki.mindseed.cn/includes/libs/rdbms/database/DBConnRef.php(806): Wikimedia\Rdbms\DBConnRef->__call()
#7 /data/wwwroot/wiki.mindseed.cn/includes/installer/DatabaseUpdater.php(718): Wikimedia\Rdbms\DBConnRef->sourceFile()
#8 /data/wwwroot/wiki.mindseed.cn/includes/installer/DatabaseUpdater.php(819): DatabaseUpdater->applyPatch()
#9 /data/wwwroot/wiki.mindseed.cn/includes/installer/DatabaseUpdater.php(547): DatabaseUpdater->addIndex()
#10 /data/wwwroot/wiki.mindseed.cn/includes/installer/DatabaseUpdater.php(515): DatabaseUpdater->runUpdates()
#11 /data/wwwroot/wiki.mindseed.cn/maintenance/update.php(202): DatabaseUpdater->doUpdates()
#12 /data/wwwroot/wiki.mindseed.cn/maintenance/includes/MaintenanceRunner.php(309): UpdateMediaWiki->execute()
#13 /data/wwwroot/wiki.mindseed.cn/maintenance/doMaintenance.php(85): MediaWiki\Maintenance\MaintenanceRunner->run()
#14 /data/wwwroot/wiki.mindseed.cn/maintenance/update.php(312): require_once('/data/wwwroot/w...')
#15 {main}

MediaWiki升级脚本报错3.png
先不管了,刷新浏览器看看结果,报错如下:

Deprecated: Use of $wgUser was deprecated in MediaWiki 1.35. [Called from MediaWiki\HookContainer\HookContainer::callLegacyHook in /data/wwwroot/wiki.mindseed.cn/includes/HookContainer/HookContainer.php at line 338] in /data/wwwroot/wiki.mindseed.cn/includes/debug/MWDebug.php on line 381

Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'User' does not have a method 'isLoggedIn' in /data/wwwroot/wiki.mindseed.cn/includes/StubObject.php on line 120

Deprecated: $wgUser reassignment detected [Called from MediaWiki\HookContainer\HookContainer::callLegacyHook in /data/wwwroot/wiki.mindseed.cn/includes/HookContainer/HookContainer.php at line 338] in /data/wwwroot/wiki.mindseed.cn/includes/debug/MWDebug.php on line 381
MediaWiki internal error.

MediaWiki升级后错误提示.png
$wgUser的问题其实出在匿名登录设置中,但是很多扩展对于1.39的匹配仍存在问题,比如CSS扩展,以至于我大量的页面报错。还有一个被弃用的钩子SkinTemplateNavigation,报错如下:

Deprecated:  Use of SkinTemplateNavigation hook (used in replaceTabs) was deprecated in MediaWiki 1.39. [Called from MediaWiki\HookContainer\HookContainer::run in /data/wwwroot/wiki.mindseed.cn/includes/HookContainer/HookContainer.php at line 137] in /data/wwwroot/wiki.mindseed.cn/includes/debug/MWDebug.php on line 381

SkinTemplateNavigation报错.png
看样子,尝鲜还是有代价的。暂时先放弃升级,等扩展稳定之后再说吧。

最后修改:2022 年 12 月 02 日
如果觉得我的文章对你有用,请随意赞赏