自从遇到这个时区相关错误在 PHP 中,我一直尝试通过更新 ICU 系统库来解决这个问题。
截至撰写本文时,我的 Fedora 39 工作站已安装版本 73.2(TZData 版本 2023c)。错误已消失。
然而,在我运行 Debian 12(Bookworm)的 VPS 上,安装的是版本 72.1(TZData 版本 2022e)。这个错误仍然存在。
有没有办法更新 Debian 的 ICU 库并通过 PHP(及其Intl
扩展)使用它?
我已经尝试libicu74
从 安装了该软件包experimental
;它安装时没有错误,但随后在 PHP 中未启用/使用。这是更新 ICU 的可行方法吗?如果是,如何为 PHP 启用它?
谢谢,
FWieP
答案1
ICU 是提供不同功能的库之一索纳梅(本质上是 libicu.so 的“库版本”),每次发布新版本时都会更新。这意味着任何使用 ICU 的软件都必须重新编译使用新版本;否则现有的 PHP intl.so 将继续尝试加载libicu.so.72
而不是新的libicu.so.74
。
(那是不是这只是文件名的问题——给每个 libicu.so 赋予不同名称的目的是为了表明该库接口可能以不兼容的方式有所不同,例如不同大小的结构等。不要尝试将“ .so.74”重命名为“ .so.72”,因为不能保证这样做会起作用 - 唯一有这样的保证是当新版本具有相同的 soname 时;这就是它的全部目的。)
这也是为什么 Debian 软件包有一个版本名称(libicu74 而不是 libicu,这样当您有需要两者的混合软件时,您可以同时安装 libicu.so.74 和 libicu.so.72)。
这意味着你必须 a)还安装来自“实验性”的 PHP 包(可能只是 php-intl 包,但最好是全部 PHP)以及随之而来的所有“Frankendebian”风险,或者 b)从标准 Debian 源构建您自己的 PHP .deb 包(即使用 dpkg-buildpackage 等),让它在构建过程中找到并链接新的 libicu。