2023年3月17日更新

今天才发现CirrusSearch扩展对Elasticsearch的要求已经上升到了7.10.2,如果继续要实用6.8.23则需要修改配置。加入代码:

$wgCirrusSearchClusters = [
        [
                'transport' => [
                        "type" => \CirrusSearch\Elastica\ES6CompatTransportWrapper::class,
                        'wrapped_transport' => 'Http'
                ],
                "port" => 9200,
                "host" => "elasticsearch_hostname"
        ]
];

好像没有什么用,只能考虑升级,至于其中遇到的坑参见《MediaWiki1.39升级CirrusSearch扩展——Elasticsearch不再支持6.x需升级到7.10.2》一文,这里就不赘述了。

2023年2月8日更新

今天终于把MediaWiki升级到了1.39版,时隔两个月,当前版本已经变成了1.39.1。
MediaWiki 1.39.1 安装完毕.jpg

阿里云的服务器使用git方式速度降到了平均7k,完全没办法用,即便是提交工单给到的回复也是无解。工程师建议我下载到本地之后再上传,所以就在虚拟机上试了一遍,再打包到服务器上。这次的过程相对顺利些,可能跟某些扩展开始兼容1.39有一定关系。

注意:

  1. 1.39中被弃用的扩展包括LocalisationUpdate,所以在升级前请在配置文件中将该启用项删除。
  2. 有部分扩展使用git方式安装之后可能会报错,如果存在这种情况,请从官网上下载对应版本(比如最新的1.39版本)后覆盖掉原有的(比如TemplateStyles和Header Tabs)。
  3. 关于SkinTemplateNavigation的钩子错误,是因为我在禁用讨论时用了如下代码,删掉就好了:

    $wgHooks['SkinTemplateNavigation'][] = 'replaceTabs';
    function replaceTabs( $skin, &$links) {

        unset( $links['namespaces']['talk'] ); // 删除讨论
        return true;

    }

  4. 使用git方式安装Elastica时会出现Error: Class 'Elastica\Client' not found,那是因为需要在该扩展目录下执行composer install --no-dev。同理,如果安装flow(也就是StructuredDiscussions)扩展的话,同样需要执行composer。总之,如果碰到类似报错的话就查看一下官方文档。

另外:

  1. Header Tabs变得没有以前好看了。
  2. 1.39相对于1.35内置了Math和TitleBlacklist扩展。

问题:

  1. 页面表单(Page Forms)的下拉菜单和Cargo表的连结似乎有问题,个别下拉菜单没办法显示内容,个别下拉菜单又能正常显示(具体解决方法见《解决MediaWiki升级至1.39后页面表单的下拉菜单变空白》一文):
  2. 本以为Math内置之后会跟可视化编辑器一样开箱即用,貌似不行。因为在国内Mathoid无法调用Wikimedia的接口,所以还是需要使用本地的(之前在虚拟机上开箱即用是因为它能直连官网,所以造成了错觉)。
  3. Cargo的表格和查询功能都正常,新加入的表格图也正常,唯独钻取出错。可以通过手动安装新版本解决,用下面介绍的方法所下载的版本为3.2,而截止到我发文的时间其实已经升级到3.4版了(具体看扩展页面的介绍)。
  4. Page Forms扩展同样报错,问题跟Cargo一样,可以手动下载了覆盖原有的,或者使用git clone时后面不加版本号1.39。
  5. 有部分中文变成了繁体,虽然不影响使用,但有些别扭。这个问题不大,有部分原因是出在扩展上,汉化不充分。

2022年12月2日原文

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

如果网速过慢的话,可以在上述代码后加入--depth=1
然后更新子模块,通常就是皮肤(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
看样子,尝鲜还是有代价的。暂时先放弃升级,等扩展稳定之后再说吧。

参考资料

https://www.mediawiki.org/wiki/Download_from_Git

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