根本原因是php命令通过update-alternatives指向了非8.1版本(如8.2),导致php -m加载的是/etc/php/8.2/cli/下的配置,而php8.1-intl仅向/etc/php/8.1/cli/conf.d/注入配置;应执行sudo update-alternatives --set php /usr/bin/php8.1确保CLI与扩展版本一致。

php -m 看不到 intl,但已装 php8.1-intl
这通常不是 intl 没装,而是 CLI 或 Web 环境根本没走到你装的版本目录。比如你运行 sudo apt install php8.1-intl,但 php --ini 显示配置路径是 /etc/php/8.2/cli/php.ini —— 那 8.1 的扩展自然不会加载。Ubuntu/Debian 多版本共存时,php 命令默认由 update-alternatives 管理,可能指向了未安装 intl 的 8.2 版本。
验证方式:php --ini 和 phpinfo() 中的 Loaded Configuration File 必须都指向 /etc/php/8.1/ 下的路径;否则装再多 php8.1-* 包都没用。
解决办法:
- 确认当前
php命令实际调用哪个二进制:which php、ls -l $(which php) - 若指向
/usr/bin/php8.2,执行:sudo update-alternatives --set php /usr/bin/php8.1 - 重启服务(CLI 不需重启,但
php-fpm或 Apache 要):sudo systemctl restart php8.1-fpm
libicu-dev 装了还是报 ICU not found
装 libicu-dev 是编译时依赖,不是运行时依赖。很多用户误以为“装完 libicu-dev 就能跑 intl”,其实它只在你从源码编译 PHP 时有用。apt 安装的 php8.1-intl 包已经静态链接或动态依赖系统 ICU 运行时库(如 libicu72),不需要手动配路径。
立即学习“PHP免费学习笔记(深入)”;
真正要检查的是运行时 ICU 库是否存在:
- 查已安装的 ICU 运行时包:
dpkg -l | grep icu(Ubuntu/Debian)或rpm -qa | grep icu(RHEL/CentOS) - 常见缺失包名:
libicu72(对应 ICU 72.x)、libicu71等,版本必须和 PHP 编译时绑定的一致 - 若缺失,直接装:
sudo apt install libicu72(Ubuntu 22.04 默认)或sudo apt install libicu73(Ubuntu 24.04)
注意:libicu-dev 和 libicu7X 是两回事,前者是头文件+静态库,后者才是 PHP 运行时真正需要的动态库。
extension=intl 在 php.ini 里取消注释却无效
apt 安装的 php8.1-intl 包**不会**往主 php.ini 里写 extension=intl,而是自动在 /etc/php/8.1/cli/conf.d/20-intl.ini(或 fpm 目录下同名文件)中生成该行。如果你手动在 php.ini 里加了,反而可能导致冲突或被覆盖。
检查是否真有生效的配置文件:
-
ls /etc/php/8.1/*/conf.d/*intl*—— 应输出类似/etc/php/8.1/cli/conf.d/20-intl.ini -
cat /etc/php/8.1/cli/conf.d/20-intl.ini—— 内容应为extension=intl,无分号,无路径 - 如果该文件不存在,说明
php8.1-intl包压根没装成功,重装:sudo apt install --reinstall php8.1-intl
别碰主 php.ini 里的 extension_dir:apt 包已预设好路径,改错会导致所有扩展失效。
intl 扩展加载了,但 Collator::create() 报错
这是 ICU 版本不匹配的典型症状。PHP 8.1 的官方 deb 包通常绑定 ICU 72 或 73,但如果你系统里混装了其他来源的 ICU(比如自己编译过、或通过 snap/flatpak 装过),就可能让 Collator、NumberFormatter 构造失败,错误信息却只是 Call to undefined method 或空异常。
验证 ICU 版本一致性:
- 查 PHP 编译时绑定的 ICU:
php --ri intl | grep ICU(看ICU version行) - 查系统运行时 ICU:
icu-config --version或ldd $(php -r "echo ini_get('extension_dir');")/intl.so | grep icu - 两者必须完全一致(如都是 72.1),差一个小版本(72.1 vs 72.2)都可能出问题
- 若不一致,最稳妥方案是卸载非官方 ICU,重装对应系统的
libicu72或libicu73
这个坑藏得深:扩展能列出来、php -m 能看到 intl、php --ri intl 也显示正常,但一用具体类就崩——本质是 PHP 和 ICU 的 ABI 不兼容,不是配置问题。



















