Apache Chroot环境下PHP报Timezone database is corrupt致命错误求助
兄弟,我太懂你这种Chroot环境下踩坑的痛苦了!你遇到的这个Timezone database is corrupt致命错误,几乎可以肯定是Chroot限制导致PHP找不到它依赖的时区数据库文件了——毕竟你把Apache的根目录锁在了/var/www,PHP自然没法访问原来系统路径下的时区数据。
给你一步步拆解解决方法,亲测在Apache 2.4+PHP7.4的环境下有效:
第一步:定位系统时区数据库的实际位置
先通过PHP命令行工具找到时区数据库的路径,执行这条命令:php -i | grep "timezone database"你会得到类似这样的输出:
Timezone database => /usr/share/zoneinfo,把这个路径记下来,这是系统原生的时区数据库目录。第二步:复制时区数据库到Chroot环境
因为Chroot后Apache的根是/var/www,所以需要把原生的时区目录完整复制到Chroot对应的路径下。比如原路径是/usr/share/zoneinfo,就执行:cp -R /usr/share/zoneinfo /var/www/usr/share/注意一定要加
-R递归复制,确保所有子时区文件都能被复制过去。第三步:修复文件权限
复制完成后,要保证Apache的运行用户(通常是www-data)能读取这些文件,执行权限修复命令:chown -R www-data:www-data /var/www/usr/share/zoneinfo chmod -R 755 /var/www/usr/share/zoneinfo第四步:验证并重启服务
先写个简单的PHP测试文件放在/var/www下,内容如下:<?php phpinfo(); ?>然后重启Apache服务:
systemctl restart apache2访问这个测试页面,找到
date相关的配置项,看看Timezone database是否显示正常,有没有再报错。
额外提醒几点:
- 有些发行版的PHP可能自带独立的时区数据库,比如在
/usr/lib/php/7.4/zoneinfo,如果上面的步骤没解决,就把这个目录也复制到/var/www/usr/lib/php/7.4/下。 - 也可以在
php.ini里直接指定默认时区(比如date.timezone = "Asia/Shanghai"),但前提是时区数据库文件已经存在于Chroot环境中,不然还是会报数据库损坏的错误。
按照这个流程走下来,应该就能解决你的问题了!如果后续还有Chroot环境下的其他依赖问题,随时来问~
备注:内容来源于stack exchange,提问作者Manthan Gajjar

