六分钟内完成复杂Joomla! 1.5迁移
Joomla! 1.5版本已经有一段时间不再被项目支持。您仍然可以使用这个版本,但安全更新将不再提供。此外,2和3版本有新的功能和改进,使得1.5看起来过时,并且可以明显看出Joomla!在过去一段时间内的进化。
将您的Joomla! 1.5网站迁移到当前项目支持的版本是一个好主意。仍然有很多网站在使用这个版本,原因很多,如时间不足、资金短缺、缺乏动力、不感兴趣等。
有时,这是因为迁移的复杂性。
最近,一位客户的一个Joomla! 1.5网站需要迁移。这是一个重大的挑战和学习的经历,我愿意与大家分享,以便在需要时能够更顺利地完成这个过程。
Exact Netherlands的Joomla网站
Exact是一家全球领先的商务软件供应商,为小型和中型企业提供完整的ERP解决方案。该公司开发云解决方案和特定于某些行业的解决方案,包括制造业、批发和分销、专业服务和会计。该公司已经使用Joomla!为其多个网站服务了几年的时间。Exact Netherlands的网站在Joomla! 1.5上运行,需要进行迁移。
这是荷兰最大的网站之一,也是公司的销售、沟通和营销的主要工具。对于Exact Netherlands来说,拥有一个稳定且始终可供访客访问的网站非常重要。
许多内容专业人士每天在该网站上工作,该网站始终处于动态状态。它使用多个自定义扩展,并包含大量菜单项、文章和模块。
迁移的主要要求
在迁移过程中考虑了一些非常重要的要求
- 网站最大中断服务时间应为两小时,夜间。
- 最终结果应保持相同的布局、功能、URL、菜单、文章等,在Joomla 2.5上运行;
- 总之,访客不应察觉到网站不同版本之间的差异。
但是,如何实现这一点?一个“正常”的Joomla迁移——创建一个副本,迁移它,修复配置并将其上线——对于Exact来说不是一个选项。这将花费很多时间,而且网站副本会在几小时后过时。
正常的Joomla迁移
为了更好地了解迁移过程,项目以正常方式开始。为了迁移Joomla核心数据,选择了使用扩展程序SP Upgrade。这个商业(付费)扩展程序安装在一个没有示例数据的Joomla 2.5上。所有1,500篇文章、650个菜单项和950个模块都通过它迁移。
该网站使用了多个第三方扩展程序,幸运的是,它们与Joomla 2.5兼容。所有扩展程序都是通过复制从1.5版本的数据库表到2.5版本的数据库来迁移的,这也可以使用SP Upgrade来完成,然后安装这些扩展程序。它们会检测数据库中的过时结构,并在必要时进行更新。模板已经有一个可用的2.5版本。
新功能和新的配置
到目前为止,我们已经完成了正常迁移的步骤。数据已经传输,但很明显,它还没有达到预期的效果。通常,这是由于与Joomla先前版本相比配置不同或新配置所导致的。一个简单的例子是菜单模块。在1.5版本中,它可以配置为显示0到3级,但是为了在2.5版本中达到相同的效果,配置必须在1到4之间进行。2.5中不再存在0级。
通常,会检查这些配置并根据需要进行调整。根据网站的大小,这可能需要几个小时或几天。一旦所有内容都经过检查并调整,网站就可以发布。这部分迁移对Exact项目来说是最关键的,因为进行调整需要很长时间,而且一切都有点不可预测。
一个定制的迁移脚本
仍然应该清楚哪些数据和配置调整是必要的,以确保两个版本完全相同。而不是通过Joomla界面进行更改,它们是在数据库中直接进行的,同时跟踪发生了什么。
所有这些更改都整合到一个定制的脚本中,该脚本由一系列SQL查询组成。合并所有必要的调整需要时间,但一旦脚本完成,SQL查询就会快速执行。
菜单级别差异
让我们创建一个简单的迁移脚本,并使用模块级别配置的调整作为示例。
创建一个名为migrate.php的文件,并将其放置在安装根目录下。在文件中插入以下代码。它修改了ID为233、294和357的模块。参数在循环中修改,然后保存到数据库中。ID为233的模块的初始级别从2更改为3。作为额外示例,将菜单类型添加到ID为294的模块中,并将面包屑导航模块ID为357的文本您在这里配置为隐藏。
define('_JEXEC', 1); // Connect with Joomla define('JPATH_BASE', __DIR__); require_once JPATH_BASE . '/includes/defines.php'; require_once JPATH_BASE . '/includes/framework.php'; // Database connection $db = JFactory::getDBO(); /** * Module changes */ // Get the modules that need changes $query = $db->getQuery(true); $query->select('*') ->from('#__modules') ->where('id IN (233,294,357)'); $db->setQuery($query); $modules = $db->loadObjectList('id'); foreach($modules as $module) { $module->params = json_decode($module->params); } // Change startLevel if ($modules[233]->params->startLevel == 2) { $modules[233]->params->startLevel = 3; echo('Module [233]: startLevel: 3
'); } // Set menutype if (empty($modules[294]->params->menutype)) { $modules[294]->params->menutype = 'mainmenu'; echo('Module [294]: menutype: mainmenu
'); } // Hide breadcrumb "You are here" if (!$modules[357]->params->showHere) { $modules[357]->params->showHere = 0; echo('Module [357]: showHere: 0
'); } // Save new module params foreach($modules as $id=>$module) { $params = json_encode($module->params); $mod = new JObject(); $mod->id = $id; $mod->params = $params; $result = $db->updateObject('#__modules', $mod, 'id'); }
脚本可在以下Gist获取:https://gist.github.com/sanderpotjer/9311435
特定扩展程序的更改
数据库中可以类似地执行此类调整。对于ZOO扩展,所有项目都需要进行访问配置的调整。由于迁移,项目变得不可见,这显然不是所期望的。可以在迁移脚本中添加以下代码,以确保ZOO项目在数据库中的访问得到修正。
/** * Component changes */ // ZOO access fixes $query = $db->getQuery(true); $fields = array('access=1'); $conditions = array('access=0'); $query->update($db->quoteName('#__zoo_item'))->set($fields)->where($conditions); $db->setQuery($query); $result = $db->query(); echo('ZOO: Access set to 1
');
脚本可在以下Gist获取:https://gist.github.com/sanderpotjer/9311435
大幅减少迁移时间
用于Exact的脚本比这个更完整,但已经对自定义迁移脚本的力量有了一定的了解:所有必要的后端操作都在几秒钟内完成,而不是几个小时或几天。这大大减少了迁移所需的时间,这对于Exact项目来说是一个重要的因素。
脚本的一个额外优点是可以多次测试和改进迁移,直到达到预期的结果。
良好的Joomla 2.5基础
除了对数据库的更改外,还需要修改服务器文件,如模板的覆盖文件。这是在测试期间进行的,结果是一个定制的安装,包括迁移结果正确运行所需的一切。
为了详细测试迁移脚本,使用了Joomla 2.5的新副本。这样,迁移就做好了更好的准备,并且在最终过程中消除了意外。
迁移的大日子
经过几周的准备,我们终于做好了最终迁移的准备。在最后时刻进行了多次测试,并在域名的子目录中创建了基本安装。一切准备就绪,开始执行以下步骤进行网站的最终迁移
- 备份1.5版本
- 将网站置于离线模式
- 使用SP Upgrade迁移数据(约一分钟)
- 将扩展表的副本复制到2.5版本的数据库中(约一分钟)
- 在2.5版本中
- 安装第三方扩展
- 应用第三方扩展的脚本
- 通过Joomla动态搜索索引内容
- 使用ACL Manager解决权限问题
- 应用自定义迁移脚本(约半分钟)
- 将Joomla 1.5的文件移动到存档目录(约半分钟)
- 将Joomla 2.5的文件移动到网站根目录(约半分钟)
- 修改configuration.php文件中的/tmp/和/log/路径,并从服务器上删除迁移脚本(约半分钟)
- 将Exact网站重新置于在线模式
六分钟内成功迁移
正如您所看到的,Exact Netherlands的网站仅离线了六分钟。在这段时间内,整个网站的数据从Joomla 1.5版本迁移到了2.5版本。
访客没有察觉到任何差异,迁移前的填写表单都被成功处理和迁移。内容编辑者在新登录后注意到一个新的界面,但他们在迁移后的网站上找到了所有更改。没有数据丢失。
在如此短的时间内成功迁移需要庆祝。为此,我们与刚出炉的美味的Joomla Stroopwafels一起庆祝!
一些重要的迁移提醒
- 清理:确保网站完全清理干净。在迁移前删除不再使用的文章、类别和模块,并清空回收站。
- 备份和测试:始终备份网站并确保恢复功能正常。
- 测试,测试,再测试:我相信您不希望在迁移过程中遇到惊喜。了解预期结果,并在迁移前彻底测试迁移。
- 紧急恢复: 请确保您可以在迁移过程中随时恢复网站的前一个版本。
- 不要等待: 立即迁移。Joomla 项目目前支持 2.5 和 3.x 版本。它们安全、稳定,并拥有大量新功能和改进。
原文作者:Sander Potjer,为 2014 年 3 月的 Joomla 社区杂志编写。
《Joomla 社区杂志》上发布的一些文章代表了作者对特定主题的个人观点或经验,可能不符合 Joomla 项目的官方立场。
通过接受,您将访问 https://magazine.joomla.net.cn/ 外部的第三方服务提供的服务
评论