你们想不想在现有环境下体验一下20年前的程序?😁
这个版本是discuz最后一个没有Ucenter的版本。
环境:PHP 8.0.2 / 8.2.9、MySQL 8.0、Nginx、Windows
数据库:discuz,表前缀cdb_,InnoDB,字符集 utf8mb4 / utf8mb4_unicode_ci
目标:让 2007 年的 Discuz! 6.0 在 PHP 8 环境下稳定运行,同时去掉长期不用的重功能,降低维护面一、改造目标
- 全站可在 PHP 8.0 及以上版本正常打开,无语法错误、无运行时 Warning、无致命错误。
- 数据库重建为 MySQL 8 推荐的 InnoDB + utf8mb4,不再保留 MyISAM 与 GBK 遗留。
- 删除十几项早已停用的扩展功能(视频、交易、支付宝、SupeSite、X-Space、道具等),并同步清理入口、后台菜单、模板、语言包、计划任务、缓存。
- 精简数据库中的无效设置项与字段,使结构、配置与代码保持一致。
- 重写安装向导,支持 PHP 8 + 非 3306 端口 + 大批量 SQL 分片导入。
- 顺带修掉一批历史安全与逻辑缺陷(IP 伪造、反射 XSS、后台 eval 拼接、计划任务判断反转等)。
二、总体结果
- 全量 498 个 PHP 文件做 PHP 8.0.2 / 8.2.9 双版本
php -l语法扫描:Discuz 核心 0 处语法错误。 - PHP 8 已移除的函数与语法(
/e正则、each()、create_function()、mysql_*()、ereg/split()、mcrypt_*()、strftime()、${var}插值等)在核心代码中 0 命中。 - 数据库最终为 68 张表、191 条设置项、1 套默认风格,后台“数据库校验”显示结构完整、无差异。
- 在
error_reporting(E_ALL)下,首页、版块页、主题页、发帖、个人中心、后台主要页面均无 Warning / 致命错误。 - 站点宽度统一为 1320px(由后台风格变量
MAINTABLEWIDTH控制,不写死在 CSS 里)。
三、功能精简(按批次)
1. 视频帖与视频 CC
- 删除:
include/viewthread_video.inc.php、api/video.php、admin/video.inc.php、模板my_video.htm。 - 清理:
post.php中的$allowpostvideo与$special == 6分支;viewthread.php的case 6;forumdisplay.php的$showvideo;发帖编辑器中的视频按钮;相关语言包词条。
2. 活动帖
- 删除:
include/viewthread_activity.inc.php、模板viewthread_activity.htm、activity_applylist.htm、post_newthread_activity.htm、post_editpost_activity.htm。 - 清理:
post.php的$allowpostactivity与$special == 4;viewthread.php的case 4;forumdisplay.php的$showactivity。
3. 辩论帖
- 删除:
include/viewthread_debate.inc.php、模板viewthread_debate.htm、viewthread_debate_posts.htm、debate_umpire.htm。 - 清理:
post.php的$allowpostdebate与$special == 5;viewthread.php的case 5;forumdisplay.php的$showdebate。
4. Google 整合
- 删除:
admin/google.inc.php、include/javascript/google.js。 - 清理:后台设置中的 Google 项目、后台菜单入口。
5. ShopEx 网店整合
- 删除:
api/shopex.php、api/relateshopex.php。 - 清理:后台 ShopEx 设置项、
logging.php登出跳转、register.php注册跳转。
6. Passport 通行证
- 删除:
api/passport.php、admin/passport.inc.php。 - 清理:后台 Passport 设置与菜单。
7. 交易帖 + 支付宝 + 信用评价
- 删除:
include/viewthread_trade.inc.php、include/newtrade.inc.php、include/ec_credit.func.php、include/search_trade.inc.php、eccredit.php。 - 删除模板:
trade*.htm、viewthread_trade*.htm、ec_*.htm、post_newthread_trade.htm、post_editpost_trade.htm、post_trade.htm、search_trade.htm、stats_trade.htm、my_trades.htm、my_tradestats.htm、my_tradethreads.htm。 - 删除接口:
api/alipayapi.php、api/alipaynotify.php、api/tradenotify.php。 - 删除后台:
admin/ecommerce.inc.php、admin/tradelog.inc.php。 - 清理:
post.php的$allowposttrade与$special == 2;viewthread.php的case 2;forumdisplay.php的$showtrade;search.php的交易搜索分支;my.php的三个交易相关分支。
8. SupeSite 整合
- 删除:
api/supesite.php、admin/supesite.inc.php、include/supesite.func.php、include/supesite_circle.inc.php、include/supesite_import.inc.php、5 个supesite_*.htm、include/crons/supe_daily.inc.php、forumdata/cache/cache_supe_updateusers.php。 - 清理:
forumdisplay.php/viewthread.php的$iscircle与 require;post.php的 import 分支;include/editpost.inc.php、misc.php中的 require;后台菜单与设置项;模板中的圈子判断。
9. X-Space 个人空间(精简而非全删)
- 删除:
blog.php、include/space.func.php、整个mspace/目录(6 套空间风格)、4 个space*.htm、spaces.lang.php、my_promotion.htm。 space.php仅保留action=viewpro(查看用户资料);viewpro.php改为跳转到精简后的资料页。- 清理:
memcp.php、include/viewpro.inc.php、include/cache.func.php中的 space 依赖;模板中的空间链接改指space.php?action=viewpro&uid=xxx。
10. Qihoo / 奇虎搜索
- 删除:
admin/qihoo.inc.php、include/search_qihoo.inc.php、include/javascript/qihoo.js、模板search_qihoo.htm、customtopics.htm。 - 清理:
search.php、misc.php、viewthread.php、include/newthread.inc.php、topic.php、index.php中的奇虎相关代码;后台设置与菜单。
11. Insenz 广告联盟
- 删除:
api/insenz.php、admin/insenz.inc.php、include/insenz.func.php、include/insenz_cron.func.php、include/javascript/insenz_reg.js。 - 清理:
include/common.inc.php的 cron 引用;include/global.func.php与viewthread.php的广告代码;后台菜单与设置项。
12. Magic 道具中心
- 删除:
magic.php、include/magic.func.php、include/magic/目录(12 个道具)、admin/magics.inc.php、5 个magic_*.htm、magics.lang.php、include/crons/magics_daily.inc.php。 - 清理:后台道具菜单、相关设置项、缓存。
13. 计划任务
- 删除:
include/crons/promotions_hourly.inc.php(推广任务)、supe_daily.inc.php、magics_daily.inc.php。 - 安装时同步删除对应的
cdb_crons记录(cronid 8、10、12、14),避免任务指向已不存在的脚本。
14. 后台菜单与缓存收尾
admin/menu.inc.php:移除 SupeSite、Passport、Google、Qihoo、视频、电子商务、Insenz、道具、ShopEx 等入口。- 清理
forumdata/cache/与forumdata/templates/中对应功能的缓存和编译产物,并重建全站缓存。
四、数据库精简
1. 结构重建
- 全部表改为 InnoDB,字符集 utf8mb4 / utf8mb4_unicode_ci。
- 重建后共 68 张表,已确认不存在
cdb_magics、cdb_ec_*、cdb_trades等已删功能的专属表。
2. 删除 11 条零引用设置项
archiverstatus、baidusitemap、baidusitemap_life、deletereason、ec_account、jscachelife、jsdateformat、jswizard、maxmagicprice、seccodeanimator、upgradeurl。3. 删除 12 个零引用字段
buddys.gradememberfields.buyercredit、memberfields.sellercreditorders.buyerusergroups中 8 个与道具、邀请、交易相关的字段
删除前均确认代码中无读取、无写入、无模板引用;删除后同步修正
usergroups、memberfields的 INSERT 语句取值个数(分别由 68 项调整为 60 项、23 项调整为 21 项),避免无列名插入错位。4. 安装时二次清理
安装向导导入 SQL 完成后,自动执行以下清理:
- 删除交易、WAP、道具、SupeSite 相关设置项,以及
videoinfo、activitytype、pluginjsmenu、tagstatus、hottags、viewthreadtags、inviteconfig、rssstatus、rssttl、frameon、framewidth等已下线功能配置。 - 删除已停用的计划任务记录。
- 仅保留默认风格(styleid=1)与对应模板,其余风格删除。
- 版块
allowpostspecial统一设为 5,即只保留“投票”和“悬赏”两种特殊主题。 - 最终安装结果为 68 张表、191 条设置项。
5. 校验文件
- 重新生成
admin/discuzdb.md5,内容与当前实际表结构、设置项完全一致。 - 后台“数据库校验”不再误报已删除功能的表或参数缺失,也不再出现 1146 表不存在错误。
五、安装向导重写(install/index.php)
原版安装器使用
mysql_*函数,PHP 8 下无法运行,且长 SQL 一次性导入容易超时。现改为:- 全程 mysqli,
mysqli_report(MYSQLI_REPORT_OFF),不再有废弃函数。 - 连接参数含端口,写入
config.inc.php的$dbport,非 3306 端口可正常安装。 - 建立数据库时指定
utf8mb4 / utf8mb4_unicode_ci。 - 导入前执行
SET SESSION sql_mode='',兼容旧版 SQL 写法。 - SQL 按语句切分,每批 20 条,记录导入位置并可续传,避免单请求超时导致表不完整。
- 表前缀、Cookie 前缀做格式校验;配置项全部
real_escape_string。 - 每个步骤使用
session随机 token(random_bytes+hash_equals)防止 CSRF。 install.lock仅在全部步骤成功后写入;中途失败不会加锁,可直接重装。- 密码、管理员账号写入均转义;安装完成后提示删除
install/目录。
六、PHP 8 兼容改造
1. 语法层
preg_replace的/e修饰符全部改造为回调或等价写法,全站已 0 命中。- 所有短标签
<?统一为<?php,避免 PHP 8.2 下整页白屏。 - 模板编译函数调整替换顺序:先替换
<?php,再替换<?,防止二次替换把 PHP 片段截断。 - 旧式同名构造器统一为
__construct(dbstuff、zipfile、SimpleUnzip、Image、Chinese、GifMerge等)。 - 数据库层
include/db_mysql.class.php重写为 mysqli:connect / query / fetch_array / result / escape_string / error / errno全部改为 mysqli 语义;连接与查询失败不再使用已移除的mysql_*。
2. 复杂插值中的数组键加引号(消除 Undefined constant 致命错误)
PHP 8 中
"{$arr[key]}"会把key当常量,直接 Fatal error。涉及位置全部改为"{$arr['key']}",包括:- 后台编辑用户:
$member['adminid']、$member['groupid']、$usergroups[...]['grouptitle']; - 后台资料字段:
$field['fieldid']; - 后台版块与分类信息:
$type['typeid']、$threadtype['typeid']; - 主题管理、短消息、积分日志、邮件模板等动态拼接处。
3. 未定义变量 / 未定义数组键初始化
按页面逐项补齐(典型问题):
- 后台编辑用户(
admin/members.inc.php): $higher['credits']、$lower['credits']增加isset判断;$uidarray未提交时用empty()判断;$usergroupid增加类型判断;$members列表变量预初始化;groupterms反序列化后统一归一为数组,main.time、adminid、groupid逐键兜底;$selecteaid预置 0-3 全部键,$selectegid预置数组,输出处加isset;- 修正
$extcredits['$i']['unit']单引号笔误(字面量永不命中),改为$extcredits[$i]['unit']。 - 后台编辑版块(
admin/forums.inc.php): $formulareplace、$formulapermexp、$projectid、$fups、$typeselect、$typemodelselect预初始化;- 分类信息、积分数组、版块组标题、
modrecommend反序列化结果逐键兜底; - 权限公式、积分公式的数组键统一加引号。
- 后台分类信息-选项管理(
admin/threadtypes.inc.php):$classoptions、$classid初始化;无选项时不再直接对查询结果取值。 - 后台批量主题管理(
admin/threads.inc.php):$beforedays增加isset判断;$multi、$fids、$tids、$threadcount预初始化。 - 后台模板编辑-详情(
admin/templates.inc.php):$keyword、$keywordadd、$keywordenc初始化;目录读取改为@dir()并判断句柄有效性,关闭前校验句柄。 - 后台主题管理(
topicadmin.php、include/moderation.inc.php):$gid等变量预初始化,积分日志与短消息相关数组键补全。 - 前台:导航
jsmenu缓存预初始化 1-4 全部键;版块页modrecommend的open、sort兜底;header导航、viewthread快速回复等模板变量初始化。
4. 反序列化与类型兜底
unserialize()结果统一做is_array()判断:groupterms、modrecommend、msgforward、creditspolicy等,避免false/null取下标告警。- 缓存缺失时先判断
$_DCACHE['settings']是否为数组,再extract();缺失则自动重建缓存并提示刷新,避免整站 500。
5.
$_SERVER键判断HTTP_REFERER:附件下载、同源校验处增加isset,无 Referer 直链不再产生 Warning,也不再导致下载头输出失败。HTTP_USER_AGENT:common.inc.php、global.func.php、counter.inc.php、post.func.php、attachment.php、pm.php、admin/styles.inc.php、admin/smilies.inc.php、admin/project.inc.php、admin/global.func.php等 12 处统一改为isset(...) ? ... : ''。PHP_SELF、SCRIPT_NAME、HTTP_HOST增加兜底,取不到时不再告警。
6. 其他运行时问题
submitcheck()对验证码、验证问答参数强制转标量,构造seccode[]=x不再触发substr(array)的 TypeError。empty($loadctrl)、$attackevasive等开关变量统一intval/布尔归一。dir()、fopen()、opendir()等资源操作增加有效性判断。- 后台设置保存:
jsmenustatus、seccodestatus、rewritestatus等数组位值正确转换;时间格式12/24键补全;积分配置只处理已配置项,避免生成多余空选项。 - 语言包:清理已删功能入口词条,补齐短消息、邮件、后台提示等缺失键,保证后台页面无空白文案、无语法错误(注意邮件正文跨行结构,避免截断)。
七、安全加固
- 客户端 IP 只信任
REMOTE_ADDR
移除对
HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR的优先读取。此前伪造请求头即可绕过后台 IP 白名单、复用他人会话 IP 绑定;现在后台访问控制、会话校验、日志记录的 IP 均不可伪造。PHP_SELF输出转义
include/security.inc.php中防御页面的表单action改为dhtmlspecialchars($_SERVER['PHP_SELF']),关闭反射型 XSS。- 去掉后台数据库备份的
eval
原代码用
eval("@unlink('$filename');")批量删除旧备份,文件名只过滤/ \ .,单引号可注入。现改为循环@unlink(),文件名收敛到备份目录内并做字符限制。- 附件下载 Referer 校验
无 Referer 时不再产生 Warning(保持原放行逻辑),跨站引用按后台开关拦截,避免告警内容破坏下载头导致附件损坏。
- 验证码 / 验证问答参数强制标量
防止数组参数把
substr()、strtoupper()打成 500。- 后台设置保存防脏数据
保存循环遇到数组值直接跳过,避免把字面量
Array写进cdb_settings;各多选项在入库前完成位值转换。- 后台表名 / 字段名白名单
admin/checktools.inc.php的修复、优化操作对表名与字段名执行^[A-Za-z0-9_]+$校验,并与基线表数组比对;资料字段删除只接受数字 ID。viewpro.php参数兜底
同时支持
uid与username,缺参数不再告警,旧链接跳转正常。八、逻辑缺陷修复
- 计划任务下次执行时间不更新
include/cron.func.php中if(!$nextrun === FALSE)运算符优先级错误,实际含义与原意相反。改为if($nextrun !== FALSE),任务执行后cronnextrun正常推进。- 查询失败后继续操作结果对象
include/db_mysql.class.php的fetch_array()、fetch_first()、result()先判断是否为mysqli_result,SILENT查询失败时返回FALSE,不再出现 “Call to a member function on bool” 致命错误。misc.php投票分页重复取参
移除对
$_GET['page']的直读,统一使用全局已做max(1, intval())保护的$page。dfopen()解析 URL 缺键
parse_url()返回的path、query、fragment逐键isset,无 query 的地址不再告警。- 后台入口变量被请求覆盖
admincp.php显式重置关键变量,$operation不再被入口清空,设置页预处理分支可正常执行;jsmenustatus等数组转位逻辑恢复正常。- 数据库校验基线更新
admin/discuzdb.md5与实际表结构、设置项同步,校验结果准确。九、界面与体验调整
- 站点宽度统一 1320px:由后台“界面 → 风格设置 → 外表格宽度”(风格变量
MAINTABLEWIDTH)控制,安装 SQL 中默认风格已设为 1320px,未在 CSS 中写死像素。 - 安装时仅保留 1 套默认风格与模板,减少无效文件与后台选择项。
- 重建全站缓存:设置、版块、风格、导航菜单、分类信息等,解决缓存缺失导致的页面异常。
- 后台模板编辑-详情页可正常列出模板文件(实测 105 个模板、220 个编辑链接),无告警刷屏。
- 前台导航、版块页、主题页的模板变量全部初始化,页面底部不再出现 Warning 文本。
十、验证方式与结果
- 语法校验:498 个 PHP 文件分别用 PHP 8.0.2 与 8.2.9 执行
php -l,Discuz 核心 0 错误。 - 运行时校验:
error_reporting(E_ALL)下访问首页、版块页、主题页、发帖/回复、个人中心、注册登录、搜索、短消息,以及后台控制面板、版块、用户、用户组、积分、分类信息、模板、数据库等页面,均无 Warning / 致命错误。 - 后台页面实测(CLI 渲染 + 浏览器):编辑用户、编辑版块、分类信息选项、批量主题管理、模板编辑详情、主题管理(置顶/精华/关闭/移动)等操作功能正常。
- 数据库校验:68 张表结构无差异,191 条设置项完整,
discuzdb.md5校验通过。 - 安装验证:分片导入可续传,失败不写
install.lock,非 3306 端口可正常安装。
十一、改动文件清单
根目录
admincp.php、ajax.php、attachment.php、config.inc.php、faq.php、forumdisplay.php、index.php、logging.php、member.php、memcp.php、misc.php、my.php、pm.php、post.php、register.php、search.php、seccode.php、stats.php、topicadmin.php、viewpro.php、viewthread.phpadmin/
header.inc.php、menu.inc.php、global.func.php、settings.inc.php、database.inc.php、checktools.inc.php、members.inc.php、forums.inc.php、threads.inc.php、threadtypes.inc.php、templates.inc.php、styles.inc.php、smilies.inc.php、project.inc.php、creditwizard.inc.php、home.inc.php、misc.inc.php、prune.inc.php、moderate.inc.php、groups.inc.php、attachments.inc.php、advertisements.inc.php、recyclebin.inc.php、logs.inc.php、announcements.inc.php、counter.inc.php、faq.inc.php、tools.inc.php、runwizard.inc.php、zip.func.php、discuzdb.md5include/
common.inc.php、global.func.php、security.inc.php、cron.func.php、cache.func.php、db_mysql.class.php、db_mysql_error.inc.php、template.func.php、post.func.php、attachment.func.php、forum.func.php、misc.func.php、discuzcode.func.php、editor.func.php、moderation.inc.php、newthread.inc.php、editpost.inc.php、viewthread_reward.inc.php、viewthread_poll.inc.php、viewpro.inc.php、category.inc.php、counter.inc.php、image.class.php、chinese.class.php、gifmerge.class.php、crons/cleanup_daily.inc.php、crons/cleanup_monthly.inc.php、javascript/post_editor.js、javascript/viewthread.jsinstall/
index.php、install.lang.php、discuz.sqltemplates/default/
header.htm、personal_navbar.htm、footer.htm、jsmenu.htm、discuz.htm、forumdisplay.htm、forumdisplay_simple.htm、viewthread.htm、viewthread_fastreply.htm、viewthread_reward.htm、viewthread_poll.htm、post_newthread.htm、post_editpost.htm、post_editor.htm、search.htm、register.htm、memcp_profile.htm、viewpro.htm、viewpro_classic.htm、css.htm、templates.lang.php、emails.lang.php、pms.lang.php、messages.lang.php、admincp.lang.php十二、后续可选清理(不影响当前使用)
phpMyAdmin为旧版整套程序,PHP 8 下多个文件无法解析,本次不在适配范围内,可单独删除或替换。api/google.php与空的include/magic/目录已无任何引用,可删除。- 后台版块设置的特殊主题勾选项仍保留交易、活动、辩论、视频的旧标签,实际已无对应发布入口,后续可简化为“投票 / 悬赏”两项。
- 部署到正式环境后,建议删除或改名
install/目录,并为forumdata/、attachments/、customavatars/增加禁止脚本执行的配置。
说明:以上改动均在源码目录完成并逐一验证,测试站在同等环境下回归通过。改造思路是“先保证能跑、再删不用的、最后收安全与逻辑”,每一步都做语法扫描与页面实测,避免一次性大改带来的不可控风险。
最后由 flinthub 编辑于 2026-10-23 15:18点赞与点评1bbs1投币50个3小时前
主楼