将 XenForo 论坛迁移到 Discourse

仅5千篇帖子,约1千名成员

3 个赞

我仍在等待大板导入器,以便尝试并测试我的 18 米帖子论坛。

3 个赞

适用于 XenForo 吗?我们确实有其他批量导入方式,但确实,处理 1800 万条帖子会非常缓慢!

4 个赞

我们正在开发自己的内部批量导入工具,用于处理2700万篇帖子。导入时间从最初的一周多(不含附件)缩短至不到一天(含所有内容)。昨天,我们成功完成了首次导入测试,未出现任何错误。这真是令人振奋的进展。

4 个赞

谢谢 Justin,我也快速看了一下——你觉得这样行吗?(如果你愿意,可以把它添加到官方导入器中)

  XENFORO_DB = "xenforo_db_3"
  TABLE_PREFIX = "xf_"
  BATCH_SIZE = 1000
  ATTACHMENT_DIR = '/FULL/PATH/TO/attachments'
  AVATAR_DIR = '/FULL/PATH/TO/avatars'

(最后一行是新增的^^——意味着你需要将头像复制到这里)

  def execute
    import_users
    import_categories
    import_posts
    import_avatars
  end

(最后一行是新增的^^)

  def import_avatars
    if AVATAR_DIR
      users = User.all
      users.each do |u|
        unless u.custom_fields["import_id"].nil?
          import_id = u.custom_fields["import_id"]
          if import_id.to_i < 1000
            dir_num = "0"
          elsif import_id.to_i > 1000
            dir_num = import_id.first
          end
        
          avatar_filename = "#{import_id}.jpg"
          file_path = "#{AVATAR_DIR}/l/#{dir_num}"
          file_path_and_name = "#{file_path}/#{avatar_filename}"

          if File.exists?(file_path_and_name)
            upload = create_upload(u.id, file_path_and_name, avatar_filename)
            if upload.persisted?
              u.import_mode = false
              u.create_user_avatar
              u.import_mode = true
              u.user_avatar.update(custom_upload_id: upload.id)
              u.update(uploaded_avatar_id: upload.id)
            else
              puts "Error: Upload did not persist for #{u.username} #{avatar_filename}!"
            end
          end
        end
      end
    end
  end

现在时间太晚了,我可能犯了一些错误或者遗漏了很多内容,但这里假设所有头像都是 .jpg 格式(看起来我的都是)。不过我对 u.import_mode 的切换不太确定,所以先把它注释掉了。

完全未经测试(这里都快凌晨 5 点了 :zzz:

我在开发机器上对拥有 10 万条帖子的论坛进行了测试,耗时 90 分钟。我要导入的那个论坛有几百万条帖子,所以时间可能是它的 10 倍?

太棒了!你们会与我们分享吗?大概什么时候?

4 个赞

目前的目标是确保它完美运行,然后在我们的网站迁移完成后,最终将其推送到 Discourse 仓库,以便其他人也能使用。

5 个赞

如果也能提供一份分步指南,那就太好了,谢谢 :slight_smile:

1 个赞

对于 5000 篇帖子和约 600 个附件,在一台较旧的 Xeon 处理器和 SSD 硬盘上,耗时约 10 分钟。建议找一台性能不错的机器,离线执行导入操作,然后让它自行运行。

5 个赞

太棒了!期待之至。

1 个赞

好的,我已经做了一个非常快速的测试,脚本的修改似乎已经生效——现在正在用几千名成员和10万篇帖子进行正式测试。如果成功,我会再汇报。

1 个赞

你好,有什么新鲜事吗?如果你需要测试方面的帮助,我很乐意提供支持。

运行 XenForo 脚本时,我遇到了一个错误,提示 users 表不存在。非常感谢您的帮助!

已经查阅了一个小时的相关资料,但尚未找到解决方案。

脚本顶部有一些变量需要填写,以便它能连接到您的 XenForo MySQL 数据库并查询数据。我认为 “import_db” 可能是占位符值——请仔细检查这些值是否填写正确。

3 个赞

@Ghan 我以为我是用这个命令导入到 import_db 的:mysql -u root -p import_db < /shared/db.sql

我的 xenforo.rb 文件如下:

好的,如果那是您的数据库名称,请确认表名是否正确。您的表名可能是带前缀的 xf_user,这会导致问题。脚本中还应有一个 TABLE_PREFIX 变量。

4 个赞

@Ghan 谢谢你!

目前,我仍然卡在导入脚本上。
它遍历用户和分类都很顺利。但在 import_posts 函数中,程序会一直挂起,直到数小时后超时。

我通过直接在 import_posts 中打印值来开始调试:

results 变量赋值之后的所有打印语句都从未输出。

以防有人想导入 vb3 论坛,如果您也拥有 XenForo 许可证,本指南或许会有所帮助:

2 个赞

此导入器是否会导入 XenForo 的标签及其关联的主题?

查看源代码总是个好主意。

我认为答案是……是的(但对 Xenforo 数据结构不太熟悉):

3 个赞

所以,看起来它至少在某些条件下为某人导入过一次标签。如果你运气好的话,它对你也会起作用!

3 个赞