网站访问白屏,PHP DateTimeZone及default_timezone报错求助
从你提供的Apache错误日志和代码片段来看,网站白屏的原因非常清晰——你的$CFG对象的default_timezone属性是空值,这直接引发了一系列PHP错误,最终导致脚本终止,页面无法正常渲染。
错误日志关键点解析
我们先拆解下日志里的核心错误信息:
PHP Notice: Undefined property: object::$default_timezone:这说明$CFG对象并没有被正确初始化default_timezone属性,或者该属性的值为空字符串。PHP Notice: date_default_timezone_set(): Timezone ID '' is invalid:尝试用空字符串设置PHP默认时区,这显然不符合PHP的时区规范,所以抛出警告。PHP Fatal error: Uncaught Exception: DateTimeZone::__construct(): Unknown or bad timezone ():当你尝试用空字符串实例化DateTimeZone类时,PHP直接抛出致命异常,脚本停止执行——这就是页面白屏的直接原因。
代码问题定位
看你提供的common.php第92-95行代码:
date_default_timezone_set($CFG->default_timezone); $dtz = new DateTimeZone($CFG->default_timezone); $dtz1 = new DateTime('now', $dtz); $CFG->timezone_offset = $dtz->getOffset($dtz1);
这段代码完全依赖$CFG->default_timezone有合法的时区值,但目前这个变量是空的,所以所有依赖它的操作都会失败。
解决方案步骤
检查
$CFG对象的初始化逻辑
找到$CFG对象被创建或配置加载的地方,确保default_timezone属性被设置为PHP支持的合法时区标识符,比如'Asia/Shanghai'、'Europe/Paris'等。示例代码:// 在$CFG初始化处添加或修正时区配置 $CFG->default_timezone = 'Asia/Shanghai'; // 替换为你实际需要的时区排查配置文件(如果是从配置读取)
如果$CFG->default_timezone是从配置文件(比如config.ini、config.php)读取的,检查配置文件中对应的时区项:- 确认配置项存在,没有被注释掉
- 时区标识符拼写正确(比如不要写成
'Shanghai',必须是PHP官方支持的格式)
临时应急修复(快速恢复页面)
如果你需要先让网站恢复访问,可以修改common.php的代码,给时区设置一个默认值兜底:// 先判断时区是否为空,为空则使用默认合法时区 $valid_timezone = !empty($CFG->default_timezone) ? $CFG->default_timezone : 'Asia/Shanghai'; date_default_timezone_set($valid_timezone); $dtz = new DateTimeZone($valid_timezone); $dtz1 = new DateTime('now', $dtz); $CFG->timezone_offset = $dtz->getOffset($dtz1);开发环境开启错误显示
为了以后更快排查问题,在开发环境可以开启PHP错误显示,这样错误会直接显示在页面上,不用每次查日志:// 在index.php开头添加 ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL);注意:生产环境一定要关闭这个设置,避免泄露服务器敏感信息。
额外提醒
你提到服务器已经配置了时区,但这里的问题是应用层面没有正确获取或设置时区值,和服务器系统时区配置无关。需要确保应用的配置加载逻辑能正确读取到时区设置,或者直接在应用代码中显式指定合法时区。
内容的提问来源于stack exchange,提问作者nonamewawrsaw

