2012年12月7日,星期五,下午6时左右,我开始动手升级 Joomla之门 网站的核心,从之前一直使用的 Joomla! 1.5.26 升级至当前最新的 Joomla! 2.5.8。这时候应该是大多数人奔跑在周末回家的路上,所以网站不会有太多的访客。选择在周五晚上升级网站核心,应该可以把对会员的影响降低到最小程度。

主要操作过程持续了大概2小时,接下来是一些小的修补和改动,以及安装针对 Joomla 2.5 新核心的扩展,这个过程用了大概6个小时。凌晨6时左右我基本上可以放心了,让新网站解除离线状态,正式上线迎接访客。

到现在差不多48小时过去了,新网站运行还算稳定。我也从熬夜的疲惫中逐渐清醒,在这里总结一下升级过程的一点体会,以供其他想要升级 J1.5 网站的站长参考。

升级到 Joomla! 2.5(图片引自 joomlart.com)
升级到 Joomla! 2.5(图片引自 joomlart.com)

我的网站在 J1.5 核心上运行时,第三方扩展不多,组件方面主要是 Remository 下载管理组件,Kunena 论坛组件,NinjaMonials 用户评价组件,jComments 文章评论组件,JoomSEF 伪静态组件。在升级之前,必须首先确定这些扩展有相应的 J2.5 版本,或者可以找到 J2.5 上的同类扩展并且可以顺利迁移数据。幸运的是,我这些组件基本上都有自己的 J2.5 版本。

接下来,要考虑的是,jUpgrade 升级工具 是否支持将这些第三方组件内容在升级过程中自动迁移。如果不支持,就需要手工操作了。我很清楚地知道,只有 Kunena 论坛组件能够享受这个待遇。其它组件的内容,都需要我手工迁移。

OK,接下来,我按照升级操作的时间顺序,简单介绍一下我在升级过程中遇到的困难、错误,以及处置的经过,希望对同样想要升级 joomla 核心的站长有一个参考。

1、离线、备份

第一个动作,当然是网站离线。然后,就是全站备份。再强调一遍:必须做完整的全站备份,并且将备份结果下载到自己电脑上保存一份。这样可以在升级失败之后确保还有“回头路”。

2、借助 jUpgrade 升级核心

在 Joomla 1.5 (旧网站)上安装 jUpgrade 组件,简单设置之后开始升级。或许有人在 JED 见过另一款收费的升级工具 SP Upgrade,我曾经试用过,并不比 jUpgrade 好多少。所以我还是建议使用免费的 jUpgrade 。

虽然可以将旧站备份包下载之后,在本地服务器上恢复网站,然后升级,然后上传、再恢复。但是考虑到 Joomla之门 网站内容较多(备份包体积超过 2GB),这样来回上传下载很费时间,我就直接远程操作升级了。在这种情况下,一定要确保网络速度够快,所以我选择了熬夜以换取比白天更快的网速。

jUpgrade 的升级过程是全自动的,你要耐心等待。完成之后,登录到新网站(Joomla 2.5 核心)后台,同时打开其前台,互相对照一下,就能发现少了很多东西。所以还要继续下面的操作:

3、安装模板

首先是安装新模板。新模板在升级之前应该事先挑选好、测试好。现在安装上之后,后面再安装新的模块,就直接发布到目标位置了。为了方便了解这些模块位置,最好打开后台模板管理中的“允许预览模块位置”选项,或者准备一张新模板的模块位置分布图。

4、手工迁移剩余数据、修补错误等

我遇到的第一个挑战就是 Kunena。前面说过,jUpgrade 可以支持自动迁移 kunena 论坛内容。没错,我的升级结果中已经有了 Kunena,版本还是我之前用过的 v1.7.2(此版本同时支持 j1.5 和 j2.5)。这个当然是旧版本了,当前最新的是 2.0.3 ,于是我安装好模板之后第一个动作就是进入新网站后台,安装 Kunena 2.0.3 中文版(覆盖安装即可自动升级)。安装完毕,我到前台查看论坛,发现了大问题:所有的版块都在,但是版块都显示“没有帖子”!也就是说,得到了一个空论坛!

很明显什么地方出错了。到 Kunena 官方论坛学习之后发现,这是 Kunena 2.0.3 版本的一个 bug。官方网站也给出了弥补的方法,一个办法是从 1.7.x 版本升级时选择 2.0.3 之前的任何一个版本(我显然已经来不及了),另一个办法针对已经使用了 2.0.3 版本升级的用户,可以在 phpMyAdmin 里面执行下面这条 SQL 查询命令(执行之前做好数据库备份!):

还必须注意一点:由于 jUpgrade 默认的升级后新站数据表前缀是 j25_ ,所以下面这条指令里面使用了 j25_ 这个前缀。如果你升级时选择了其它前缀(可以在 jUpgrade 参数里面修改),请相应修改下面指令中的数据表前缀。

UPDATE j25_kunena_topics AS tt
INNER JOIN (
	SELECT thread, MIN(hold) AS hold FROM j25_kunena_messages WHERE hold IN (0,1) GROUP BY thread
) AS c ON tt.id=c.thread
SET tt.hold = c.hold
WHERE tt.moved_id=0

执行了上述 SQL 指令之后,再到 Kunena 后台的“论坛工具”里面,点击“重新计数”,论坛就恢复正常了。

接下来我换了一个浏览器来看前台效果,结果看到的是错误页面,上面只显示了如下的出错消息(我略作修改隐去路径信息):

Notice: Undefined variable: app in /home/domain/XXXXX.XX/public_html/templates/gantry/offline.php on line 38 Fatal error: Call to a member function getCfg() on a non-object in /home/domain/XXXXX.XX/public_html/templates/gantry/offline.php on line 38

为什么我刚才还看到论坛页面正常,现在换了个浏览器就只看到出错信息呢?这是由于新浏览器里面没登录,所以看到的应该是离线网站(jUpgrade 升级时继承了旧站的离线状态,我也没更改,因为管理员可以从前台登录进去维护网站)。冷静分析了一下,这个出错信息提到了我刚刚安装的新模板 Gantry,并且与 offline.php 文件有关,很显然这个错误表明:原因应该出在模板上,并且只影响离线页面。

接下来又去 Gantry 的老家搜索资料,终于找到同样有人遇到过这种情况,官方也在论坛上给出了解决办法:

打开 templates/gantry/lib/gantry/gantry.php 这个文件,在其末尾添加一句代码:

$app = JFactory::getApplication();

这样处理之后,此问题得到解决。

接下来,我要迁移 jUpgrade 未能自动迁移的那些数据,包括 Remository 、NinjaMonials 以及 jComments 的数据。这里面附带的困难是:由于网站下载栏目内容多,数据表体积必然较大。我们要通过远程的 phpMyAdmin 来手工处理,就必须了解相关的 SQL 查询指令,以避免“导出”、“导入”动作的麻烦。

通过 Google 学习之后,找到了下面两条指令:

CREATE TABLE prefix_mytbl_new LIKE dbname.prefix_mytbl_old;
INSERT prefix_mytbl_new SELECT * FROM dbname.prefix_mytbl_old;

第一个命令是创建新的数据表 mytbl_new(这里的 prefix_ 代表数据表前缀,因为 jUpgrade 升级过程中会自动使用不同于旧网站的数据表前缀,因此我们在操作数据迁移时必须注意好使用新的数据表前缀),并复制 mytbl_old 的数据表结构。 第二个命令是将数据表 mytbl_old 中的数据复制到新表 mytbl_new 。

上述指令中的“dbname.” 代表数据库名称。如果是复制数据表到同一个主机的另一个数据库,就要用到这个名称。不过,我们的操作都是在同一个数据库里面(因为 jUpgrade 升级过程会在与旧站相同的数据库中创建新表,只通过数据表前缀来区别旧站与新站),所以我在实际操作时可以省略 dbname. 这一部分。

经过这个操作,顺利迁移了 jUpgrade 未能自动迁移的全部数据表(请同样有迁移 Remository 数据的用户参考其官方网站说明,了解具体迁移哪几个表)。然后在 Joomla 2.5 新网站上安装对应的组件,就能自动发现已存在的数据并接管(相当于升级自身)。

接下来,还发现了两个小问题:

一个是 Kunena 版本升级导致自定义的 rank (会员等级)图片丢失。这是因为 Kunena 1.7.x 与 Kunena 2.0.x 保存等级图片的位置不同,前者是在 kunena 组件安装目录里面,后者是在系统的 /media 目录里面。所以,升级之后需要手工复制过来。

第二个问题是,jUpgrade 升级时没有迁移友情链接组件(com_weblinks)的“类别”(据说除了文章系统的“类别”之外,其它组件的类别它都不迁移),只生成一个名为“uncategorized” (未分类)的无用类别,导致升级之后友情链接部分的链接失效。这个需要对照旧站,自己手工创建。

最后就是 SEF 伪静态的处理了。我再次提醒各位 Joomla 用户,网站的 SEF 一定要放在最后进行。jUpgrade 同样不支持 JoomSEF 3.x (针对 j1.5)向 JoomSEF 4.x (针对 j2.5)的迁移。好在只要文章、菜单的别名(Alias)不变,就不用担心,因为 JoomSEF 可以生成同样的友好网址。因此,我无需手工迁移 JoomSEF 的数据表,只要在新网站上直接安装 JoomSEF 4,就能自动再生成新的友好网址(除非你之前设置了很多的“自定义友好网址”,这些自定义的网址没法自动生成,还需要再次手工创建。如果数量巨大,还是考虑迁移数据表吧)。

以上只是处理了网站上最主要的组件部分。接下来还要安装各种模块、插件,并一一进行设置。我要提醒的是:尽量选择你了解,最好是已经测试过的扩展。不要在你的正式网站上直接安装未试用过的扩展(所以说在 PC 上面搭建一个测试服务器是非常有必要的)。

大家可以看到,尽管费了这么多功夫,目前 Joomla之门 升级后的网站还不够完美,论坛上好几个子菜单链接都无法打开(这是 SEF 的问题,仍在等待 Artio 官方解决)。所以,网站升级之后,大家还要继续关注网站的变化,留意访客的反馈,发现问题及时纠正。我在此也欢迎各位来访的朋友指出网站存在的问题(发邮件到 这个 E-mail 受反垃圾邮件程序保护,您需要启用 JavaScript 才能查看。),我会尽力去纠正。谢谢!