Discuz! X3.5 原生不支持 PHP 8.0,必须使用 20240520 及以后官方适配版,否则因 each() 废弃、array_merge() 类型严格等硬伤直接报错;需同时启用 mysqli/pdo_mysql、设置 cgi.fix_pathinfo=1、显式配置时区及 URL 编码含特殊字符的数据库密码。

Discuz! X3.5 可以在 PHP 8.0 下运行,但必须打补丁或升级到官方适配版(如 20240520 Release),否则会直接报 array_merge(): Argument #2 must be of type array, null given 或 Function each() is deprecated 等致命错误。
Discuz! X3.5 在 PHP 8.0 下启动就报错怎么办
这不是配置问题,是代码兼容性硬伤。X3.5 原生不支持 PHP 8.0,官方直到 20240520 版本才正式声明兼容 PHP 8.0+。如果你用的是老包(比如 X3.5 SC UTF8 2022 或更早),即使把 opcache、mysqli、mbstring 全开,也必然卡在安装页或首页白屏。
- 检查你解压后的
upload/install/目录里是否有version.php,打开看DISCUZ_VERSION值:若为X3.5且无年份后缀,基本可判定是未修复版 - 必须换用带明确时间戳的包,例如
Discuz_X3.5_SC_UTF8_20240520.zip—— 这个版本已移除each()、重写array_merge调用逻辑,并适配mysql_real_escape_string废弃问题 - 不要试图手动注释报错行或用
@抑制错误:PHP 8.0 已彻底移除这些函数,抑制只会导致后续逻辑崩坏(比如用户无法注册、帖子无法提交)
PHP 8.0 必须启用的扩展和关键配置项
即使用了 20240520 版,缺了以下扩展或配错参数,Discuz! 仍会提示“环境检测失败”或后台功能异常(如 UCenter 同步失败、附件上传 0 字节)。
-
extension=mysqli和extension=pdo_mysql必须同时开启 —— Discuz! X3.5 的数据库层同时依赖两者,只开一个会导致后台「站长」→「数据库」→「优化表」直接 500 -
opcache.enable=1+opcache.revalidate_freq=60:不开启 OPcache,首页 TTFB 普遍 > 1.2s;但revalidate_freq别设成 0,否则模板修改后不生效 -
date.timezone必须显式设置(如Asia/Shanghai),否则发帖时间显示为 1970-01-01,且日志报It is not safe to rely on the system's timezone settings -
upload_max_filesize和post_max_size建议设为20M起步,否则附件上传卡在进度条 99%(Discuz! 前端无明确提示)
Nginx/Apache 下 PHP 8.0 的常见伪静态与 PATH_INFO 陷阱
Discuz! X3.5 的 URL 路由严重依赖 PATH_INFO,而 PHP 8.0 默认关闭该特性,Nginx 配置稍有偏差就会导致「抱歉,您指定的版块不存在」或全部跳转到 index.php。
立即学习“PHP免费学习笔记(深入)”;
- Apache 用户:确认
.htaccess中RewriteCond %{REQUEST_FILENAME} !-f和RewriteCond %{REQUEST_FILENAME} !-d存在,且AllowOverride All已在虚拟主机配置中放开 - Nginx 用户:不能只抄通用 LNMP 伪静态规则,必须确保
fastcgi_split_path_info ^(.+?\.php)(/.*)$;这一行存在,且fastcgi_param PATH_INFO $fastcgi_path_info;被正确传递 - 无论哪种服务器,都需在
php.ini中确认cgi.fix_pathinfo=1(PHP 8.0 默认为 0),设为 0 会导致$_SERVER['PATH_INFO']始终为空,整个路由系统瘫痪
最易被忽略的一点:Discuz! X3.5 的 config/config_ucenter.php 和 config/config_global.php 中的数据库密码如果含特殊字符(如 @、/、:),PHP 8.0 的 parse_url() 解析会失败,表现为 UCenter 通信失败但无任何错误日志 —— 此时应 URL 编码密码(如 @ → %40),而非删掉特殊字符。



















