如何让PHP8.1使用外部timezonedb而非Mac OS内置时区数据库
Homebrew更新后PHP时区数据库未切换至timezonedb扩展问题
问题描述
更新Homebrew后,Homebrew升级了“Olson”时区数据库版本,原本打算通过timezonedb扩展规避影响,但PHP仍在使用内置时区数据库而非外部扩展。
已完成的扩展安装操作:
- 执行命令
sudo pecl install timezonedb-2022.5安装指定版本的扩展 - 在conf.d目录下的.ini配置文件中添加
extension=timezonedb.so
执行 php -i | grep -i timezone 得到的结果:
"Olson" Timezone Database Version => 2022.7 Timezone Database => internal Default timezone => UTC date.timezone => no value => no value timezonedb Alternative Timezone Database => enabled Timezone Database Version => 2022.5
可见PHP已识别timezonedb扩展,但仍使用内置数据库。环境为Homebrew安装的PHP 8.1(其他版本也试过),已通过 brew install php@8.1 && brew link php@8.1 创建符号链接,其他扩展均正常工作。
解决方案
1. 调整扩展加载顺序
timezonedb需要比PHP内置的date模块更早加载,否则内置数据库会优先生效:
- 通过
php --ini查看「Additional .ini files parsed」对应的conf.d目录路径 - 将包含
extension=timezonedb.so的.ini文件重命名为00-timezonedb.ini,确保它是第一个被加载的配置文件
2. 确认PHP编译配置
部分Homebrew编译的PHP版本默认禁用了timezonedb的替代功能:
- 执行
php -i | grep -i "configure arguments",检查是否包含--enable-timezonedb - 如果没有该参数,重新编译PHP并添加选项:
brew reinstall php@8.1 --configure-options="--enable-timezonedb"
3. 重启PHP服务(若使用PHP-FPM)
修改配置后必须重启服务才能生效:
brew services restart php@8.1
4. 验证结果
重新执行 php -i | grep -i timezone,检查 Timezone Database 是否变为 timezonedb,且版本显示为2022.5。
内容的提问来源于stack exchange,提问作者svichka
相关产品推荐
相关产品推荐

