探讨当年 discuz 出品的 5d6d 是怎么实现的

2020-02-26 20:03:05 +08:00
 luguiyao

先说说 5D6D 实现了哪些功能,解决了哪些需求吧

1.5D6D 注册后自动生成 discuz 论坛,解决了部署方便快捷的需求;

2.5D6D 生成的论坛核心程序是同一个,并不会同样的程序生成多份(当年我向管理反映问题时,管理在论坛目录下创建了个临时文件进行调试,我在另外论坛下访问同样可以访问到,从这点可以进行佐证)。解决的是统一管理,便于维护的需求;

3.附件和数据表可以导出,数据独立,(貌似一开始是需要花金币才可以导出,最后需要购买官方虚拟主机才可以导出)。数据机动灵活,随时可以拆分。

然后说说我的猜想,可能说得不对,望大佬指正

第 1 点实现应该不难,生成的数据表应该加了字段,很可能是根据在 5D6D 上注册用户的 UID 来关联的;

第 2 点把临时文件和附件路径同样做了修改,应该也是根据 UID 来分别存放的;

第 3 点实现方式同第 2 点一样。

我想到的一些疑问:

以上方面实现后,怎么通过访问域名来判断识别要展示的某个论坛呢?因为程序是同一个,配置的数据库也是同一个,按一般的情况,多个域名绑定在同一台服务器上,展示的内容是一样的。这里是通过 HTTP_HOST 获取关联的 UID 然后读取对应论坛的数据么?那么数据库其实只有一个吧?但是很奇怪,当时我申请数据导出的时候,获取到的是数据库原文件(也就是直接在数据库目录下打了个压缩包给我,并不是导出的 sql 文件),如果是统一在一个数据库里肯定是通过 SQL 语句 where uid 来导出才是。

我想到的暂时只有这些,想了解一下真实的情况(如果有当年参与该项目的大佬看到的话),或者有经验的大佬们说说最有可能实现的方法,还有我没有想到的一些技术上的难题。

以上纯属小白的一些疑问和猜想,想得比较简单,请各位大佬们不要见笑,为小白扩展下知识。

10562 次点击
所在节点    PHP
57 条回复
lhx2008
2020-02-26 20:11:26 +08:00
站抖没了。。现在要弄肯定是 docker
shansing
2020-02-26 20:52:12 +08:00
我曾想仿照 WordPress MU 制作 Typecho MU,自己想的大概是独立数据库+独立用户目录+通过 Host 分配的方法。总之我觉得“因为程序是同一个,配置的数据库也是同一个”不对。程序肯定是要进行二次开发的,不会跟原来一模一样。说不定思路就是独立数据库。
luguiyao
2020-02-26 21:10:47 +08:00
@shansing 用独立数据库的话,怎么调用数据库是个问题吧
mayx
2020-02-26 21:17:39 +08:00
我觉着可能和负载均衡的原理差不多
luguiyao
2020-02-26 21:20:21 +08:00
@mayx 负载均衡是针对同一站点的,5D6D 虽然是同一程序,但是访客访问的时候显然是独立的站点
batnss
2020-02-26 21:53:55 +08:00
硬逻辑 先生成多个程序和数据库 ; 然后看看哪里可以减; 一个个减下来
areless
2020-02-26 22:03:14 +08:00
搞过单数据库多用户自主创建的 WordPress……简单的用一个四级域名产生一组标识,标注该 WordPress 归属于谁,并不新建 table。
xcai
2020-02-26 22:05:02 +08:00
@luguiyao 你可能忘记了表前缀这东西
veDone
2020-02-26 22:07:51 +08:00
虽然不懂你们在说什么,但是 10 多年前我小学五六年级用 5d6d 建了一个口袋妖怪游戏论坛。由于插件限制,5d6d 没有提供当时各大私人论坛非常火爆的“无心宠物”等其他游戏娱乐插件。让我一个小学生,第一次接触到了 PHP/Mysql 数据库等计算机技术。申请免费的国外空间,建了我第一个 BBS。都是回忆啊。
GM
2020-02-26 22:27:56 +08:00
根据你的描述: [当时我申请数据导出的时候,获取到的是数据库原文件(也就是直接在数据库目录下打了个压缩包给我,并不是导出的 sql 文件]

有且仅有一种可能:每个用户一个独立数据库。

那么怎么切换数据库呢?
我现在的公司有一个类似项目,大概原理如下( php 代码):

$userId = getUserIdFromDomain();
$groupId = getGroupIdFromUserId($userId);
$dbHost = getDbHostByGroupId($groupId);
$connStr = "mysql://{$dbHost}/{$userId}";

$conn = mysql_connect($connStr);
$result = mysql_query($conn, ....);
luguiyao
2020-02-26 22:28:55 +08:00
@xcai 可是官方给我的数据库表前缀是默认的,而且给的是没有修改过的源文件(文中最后有提到)
luguiyao
2020-02-26 22:31:40 +08:00
@GM 你的回答应该就是真相了
porwyn
2020-02-26 22:39:11 +08:00
想起以前也折腾过
qq292382270
2020-02-26 22:45:06 +08:00
数据库是独立的,文件同一个就没啥了.
没记错的话站长只有登录后台管理的功能,所以不同站点修改的东西只体现在数据库里,对文件无影响.
WordPress 也有这样的功能,可以无限创建分站.
y0bcn
2020-02-26 22:53:34 +08:00
@veDone +1,都是回忆,当年要申请的时候 5d6d 已经不开放了,当时 phpwind 也有一个,也不开放了,后来有了一个 mf530,玩了好久
g5hdyd
2020-02-26 23:00:29 +08:00
当年就是加了个 site_id
keepeye
2020-02-26 23:14:26 +08:00
可能根据不同的域名连接不同的数据库?
CRight
2020-02-26 23:21:37 +08:00
我的领地。满满都是回忆,申请也一点都不困难,也没实名制什么的。
yulon
2020-02-27 00:41:03 +08:00
就是虚拟主机只给你论坛的后台,连什么 docker、虚拟化都不用,多用户就行了,可能多用户都不用,HTTP 协议本来就可以区分域名
cnzfq
2020-02-27 00:59:02 +08:00
@qq292382270 请问 WordPress 同样的功能怎么实现?有现成的插件吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/647813

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX