你们想不想在现有环境下体验一下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 环境下稳定运行,同时去掉长期不用的重功能,降低维护面


一、改造目标

  1. 全站可在 PHP 8.0 及以上版本正常打开,无语法错误、无运行时 Warning、无致命错误。
  2. 数据库重建为 MySQL 8 推荐的 InnoDB + utf8mb4,不再保留 MyISAM 与 GBK 遗留。
  3. 删除十几项早已停用的扩展功能(视频、交易、支付宝、SupeSite、X-Space、道具等),并同步清理入口、后台菜单、模板、语言包、计划任务、缓存。
  4. 精简数据库中的无效设置项与字段,使结构、配置与代码保持一致。
  5. 重写安装向导,支持 PHP 8 + 非 3306 端口 + 大批量 SQL 分片导入。
  6. 顺带修掉一批历史安全与逻辑缺陷(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.grade
  • memberfields.buyercredit、memberfields.sellercredit
  • orders.buyer
  • usergroups 中 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 键补全;积分配置只处理已配置项,避免生成多余空选项。
  • 语言包:清理已删功能入口词条,补齐短消息、邮件、后台提示等缺失键,保证后台页面无空白文案、无语法错误(注意邮件正文跨行结构,避免截断)。

七、安全加固

  1. 客户端 IP 只信任 REMOTE_ADDR

移除对 HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR 的优先读取。此前伪造请求头即可绕过后台 IP 白名单、复用他人会话 IP 绑定;现在后台访问控制、会话校验、日志记录的 IP 均不可伪造。

  1. PHP_SELF 输出转义

include/security.inc.php 中防御页面的表单 action 改为 dhtmlspecialchars($_SERVER['PHP_SELF']),关闭反射型 XSS。

  1. 去掉后台数据库备份的 eval

原代码用 eval("@unlink('$filename');") 批量删除旧备份,文件名只过滤 / \ .,单引号可注入。现改为循环 @unlink(),文件名收敛到备份目录内并做字符限制。

  1. 附件下载 Referer 校验

无 Referer 时不再产生 Warning(保持原放行逻辑),跨站引用按后台开关拦截,避免告警内容破坏下载头导致附件损坏。

  1. 验证码 / 验证问答参数强制标量

防止数组参数把 substr()、strtoupper() 打成 500。

  1. 后台设置保存防脏数据

保存循环遇到数组值直接跳过,避免把字面量 Array 写进 cdb_settings;各多选项在入库前完成位值转换。

  1. 后台表名 / 字段名白名单

admin/checktools.inc.php 的修复、优化操作对表名与字段名执行 ^[A-Za-z0-9_]+$ 校验,并与基线表数组比对;资料字段删除只接受数字 ID。

  1. viewpro.php 参数兜底

同时支持 uid 与 username,缺参数不再告警,旧链接跳转正常。


八、逻辑缺陷修复

  1. 计划任务下次执行时间不更新

include/cron.func.php 中 if(!$nextrun === FALSE) 运算符优先级错误,实际含义与原意相反。改为 if($nextrun !== FALSE),任务执行后 cronnextrun 正常推进。

  1. 查询失败后继续操作结果对象

include/db_mysql.class.php 的 fetch_array()、fetch_first()、result() 先判断是否为 mysqli_result,SILENT 查询失败时返回 FALSE,不再出现 “Call to a member function on bool” 致命错误。

  1. misc.php 投票分页重复取参

移除对 $_GET['page'] 的直读,统一使用全局已做 max(1, intval()) 保护的 $page。

  1. dfopen() 解析 URL 缺键

parse_url() 返回的 path、query、fragment 逐键 isset,无 query 的地址不再告警。

  1. 后台入口变量被请求覆盖

admincp.php 显式重置关键变量,$operation 不再被入口清空,设置页预处理分支可正常执行;jsmenustatus 等数组转位逻辑恢复正常。

  1. 数据库校验基线更新

admin/discuzdb.md5 与实际表结构、设置项同步,校验结果准确。


九、界面与体验调整

  • 站点宽度统一 1320px:由后台“界面 → 风格设置 → 外表格宽度”(风格变量 MAINTABLEWIDTH)控制,安装 SQL 中默认风格已设为 1320px,未在 CSS 中写死像素。
  • 安装时仅保留 1 套默认风格与模板,减少无效文件与后台选择项。
  • 重建全站缓存:设置、版块、风格、导航菜单、分类信息等,解决缓存缺失导致的页面异常。
  • 后台模板编辑-详情页可正常列出模板文件(实测 105 个模板、220 个编辑链接),无告警刷屏。
  • 前台导航、版块页、主题页的模板变量全部初始化,页面底部不再出现 Warning 文本。

十、验证方式与结果

  1. 语法校验:498 个 PHP 文件分别用 PHP 8.0.2 与 8.2.9 执行 php -l,Discuz 核心 0 错误。
  2. 运行时校验:error_reporting(E_ALL) 下访问首页、版块页、主题页、发帖/回复、个人中心、注册登录、搜索、短消息,以及后台控制面板、版块、用户、用户组、积分、分类信息、模板、数据库等页面,均无 Warning / 致命错误。
  3. 后台页面实测(CLI 渲染 + 浏览器):编辑用户、编辑版块、分类信息选项、批量主题管理、模板编辑详情、主题管理(置顶/精华/关闭/移动)等操作功能正常。
  4. 数据库校验:68 张表结构无差异,191 条设置项完整,discuzdb.md5 校验通过。
  5. 安装验证:分片导入可续传,失败不写 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.php

admin/

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.md5

include/

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.js

install/

index.php、install.lang.php、discuz.sql

templates/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
主楼