2012年12月7日,星期五,下午6时左右,我开始动手升级 Joomla之门 网站的核心,从之前一直使用的 Joomla! 1.5.26 升级至当前最新的 Joomla! 2.5.8。这时候应该是大多数人奔跑在周末回家的路上,所以网站不会有太多的访客。选择在周五晚上升级网站核心,应该可以把对会员的影响降低到最小程度。
主要操作过程持续了大概2小时,接下来是一些小的修补和改动,以及安装针对 Joomla 2.5 新核心的扩展,这个过程用了大概6个小时。凌晨6时左右我基本上可以放心了,让新网站解除离线状态,正式上线迎接访客。
到现在差不多48小时过去了,新网站运行还算稳定。我也从熬夜的疲惫中逐渐清醒,在这里总结一下升级过程的一点体会,以供其他想要升级 J1.5 网站的站长参考。
我的网站在 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 才能查看。),我会尽力去纠正。谢谢!