Discuz X5.0通过连接已有UCenter方式安装时出现白屏或500的解决方法
问题描述
当在Discuz X5.0的过程中,通过连接已有UCenter方式安装时出现白屏,响应码为500,响应体为空。
问题原因
由于无法输出任何错误信息,查看log文件也是一无所获,因此通过注册一个结束时函数来在注释中输出错误信息。
register_shutdown_function(function() {
$e = error_get_last();
if($e && in_array($e['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) {
echo "\n<!--FATAL: {$e['message']} @ {$e['file']}:{$e['line']}-->\n";
}
});通过上述手法,我们获取到了实际上的错误信息。
<!--FATAL: Uncaught Error: Call to undefined function censor() in /www/wwwroot/bbs.****.com/source/class/uc/client.php:403
Stack trace:
#0 /www/wwwroot/bbs.****.com/install/include/install_function.php(1657): uc_user_register()
#1 /www/wwwroot/bbs.****.com/install/include/install_run_install.php(321): check_adminuser()
#2 /www/wwwroot/bbs.****.com/install/index.php(52): require('...')
#3 {main}
thrown @ /www/wwwroot/bbs.****.com/source/class/uc/client.php:403-->censor()是Discuz中用于敏感词屏蔽的关键函数,但是在Discuz的安装过程中,由于安装流程调用了基于核心框架存在的UCenter客户端代码,但安装过程并不会引入Discuz框架,而UCenter客户端又没有对无框架的调用进行兼容,于是引发了致命错误。
临时缓解措施
找到/source/class/uc/client.php文件,将:
if($censor)
批量替换为:
if($censor && function_exists('censor'))
