php -m | grep intl 无输出是因为 cli php 未启用 intl 扩展,需先确认 composer 使用的 php 路径及对应 php.ini,再按系统(ubuntu/debian/windows)精确安装并手动启用 extension=intl,或使用 symfony/polyfill-intl-icu 兜底。

php -m | grep intl 为什么没输出?先确认 CLI 环境是否真缺扩展
很多人看到 composer install 报 requires ext-intl *,立刻去改 Apache 的 php.ini,结果终端里还是报错——因为 Composer 调用的是 CLI SAPI 的 PHP,和 Web 服务用的不是同一套配置。
必须先查清楚 Composer 实际用的是哪个 PHP:
- 运行
composer diagnose,看输出里的PHP binary路径 - 再用这个路径查扩展:
/usr/bin/php -m | grep intl(把路径替换成你的真实路径) - 接着查它读的是哪个配置:
/usr/bin/php --ini,重点看Loaded Configuration File
Linux/macOS 下常见陷阱:系统装了 php8.2-intl,但 CLI 的 php 是 8.1,或者 Homebrew 安装的 php@8.2-intl 没在 php.ini 里显式启用 extension=intl。
Ubuntu/Debian 上安装 php8.2-intl 后仍不生效?包名和版本必须严格匹配
Debian 系发行版对 PHP 版本极其敏感。只运行 sudo apt install php-intl 很可能什么也不装——它默认指向系统默认 PHP 版本,而你的 php -v 输出可能是 8.2.12。
正确做法是:
- 先确认当前 CLI PHP 版本:
php -v - 按版本号精确安装:
sudo apt install php8.2-intl php8.2-mbstring php8.2-xml - 安装完不用重启 CLI,但得验证:
php -m | grep intl必须有输出 - 如果仍无输出,检查
php --ini显示的配置文件里是否有extension=intl;没有就手动加一行
注意:php8.2-intl 包本身不修改 php.ini,它只把 intl.so 放进扩展目录,启用靠你自己。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
Windows 下 extension=intl 启用失败?别只改主 php.ini
Windows 用户常卡在这一步:改了 C:\xampp\php\php.ini,phpinfo() 页面能看到 intl,但命令行跑 composer install 还是报错。
问题大概率出在 CLI 用了独立配置文件:
- 运行
php --ini,如果输出里Scan for additional .ini files in非空,或Loaded Configuration File跟你想的不一样,说明 CLI 正在读另一个 ini - XAMPP/Laragon 常为 CLI 自动生成
php-cli.ini,位置可能在C:\xampp\php\php-cli.ini或同级目录 - 检查
extension_dir是否指向正确目录:php -r "echo ini_get('extension_dir');",然后进该目录确认是否存在php_intl.dll - 确保
php_intl.dll架构(x64/x86)跟 PHP 一致,否则加载会静默失败
实在装不上 intl 扩展?symfony/polyfill-intl-icu 是最轻量的兜底方案
共享主机、老旧容器、或 CI 环境里无法编译扩展时,symfony/polyfill-intl-icu 是唯一可行的替代路径——它不依赖 ICU 库,纯 PHP 实现,且自动注入全局命名空间。
执行即可:
composer require symfony/polyfill-intl-icu- 无需额外配置,安装后 Composer 不再报
ext-intl缺失 - 注意:polyfill 只覆盖基础类(如
NumberFormatter、Locale),不支持MessageFormatter::formatMessage()这类 ICU 特有功能;若项目真用到,仍需原生扩展 - 性能比原生 intl 低 3–5 倍,仅适合开发或低流量场景
真正容易被忽略的是:polyfill 不解决 ext-intl 版本号校验。如果 composer.json 写了 "ext-intl": ">=70.1",光装 polyfill 不够,还得配合 "config": {"platform": {"ext-intl": "70.1"}} 告诉 Composer “假装满足”。但这只是跳过检查,运行时行为仍由 polyfill 决定。










