服务器时区已经设成东八区,命令行输出正确,网站后台显示的时间却始终少八小时,日志时间也和系统对不上。

排查方向其实有限,先把可能性排一排。运行时配置里单独写了时区,覆盖了系统设置。还有一种是框架启动时硬编码成了协调世界时。

不容易想到的是,数据库连接的时区与服务器不一致。

第一件事是看运行时实际生效的时区

php -i | grep date.timezone

随后改配置并重启服务

sed -i 's|^;date.timezone.*|date.timezone=Asia/Shanghai|' /etc/php.ini

然后核对框架的时区配置

grep -rn timezone config/

等前面都确认过,再确认数据库连接时区

mysql -e 'select @@global.time_zone,now()'

当时还开着另一个排查窗口,两边日志对照着看才定位到。

改完先别撤,确认这几项。页面显示时间与系统输出一致,日志时间戳和系统时间对得上。

时区要统一在三处:系统、运行时、数据库连接;只改一处往往只是把偏差挪到了另一个地方。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189