phpinfo()是最直观完整的扩展查看方式,可显示已加载扩展、配置项、版本、状态及依赖;需通过Ctrl+F搜索“Loaded Extensions”等关键词快速定位,注意区分CLI与Web的php.ini路径。
phpinfo() 输出确实包含扩展信息,而且是最直观、最完整的查看方式之一——它不仅列出已加载的扩展,还显示每个扩展的配置项、版本、启用状态及依赖关系。
phpinfo() 快速定位扩展状态直接在浏览器中访问一个仅含 phpinfo(); 的 PHP 文件(如 info.php),页面会滚动出大量配置数据。关键不是从头看,而是按 Ctrl+F 搜索以下关键词:
Loaded Extensions:位于“PHP Credits”之后、“Configuration”之前,是纯扩展名列表(如 mysqli、curl、gd)gd):能跳转到该扩展专属区块,看到是否启用、INI 设置路径、编译参数等Loaded Configuration File:点开链接可确认当前生效的 php.ini 路径,避免改错文件注意:如果页面没出现 Loaded Extensions 区块,说明 PHP 是以 CGI/CLI 模式运行且未启用 display_errors 或被安全策略屏蔽了部分输出——这时应优先转向命令行验证。
php -m 和 get_loaded_extensions() 的区别与适用场景两者都返回“已加载”的扩展,但底层逻辑不同:
php -m:读取 CLI SAPI 下所有已编译+启用的模块,包括被 php.ini 中 extension= 行激活的,也包括静态编译进 PHP 二进制的(如 standard、json)。输出为纯文本列表,适合脚本解析get_loaded_extensions():PHP 运行时函数,只返回当前请求生命周期中真正加载成功的扩展(排除因依赖缺失或配置错误而静默失败的)php -m 显示 redis,但 Web 页面里 extension_loaded('redis') 返回 false —— 很可能 CLI 和 Web 使用的是两套 php.ini(比如 Apache 用 /etc/php/8.2/apache2/php.ini,而 CLI 用 /etc/php/8.2/cli/php.ini)php -r 'print_r(get_loaded_extensions());'
extension_loaded() 比查 php.ini 更可靠很多人习惯打开 php.ini 找 extension= 行来判断扩展是否启用,但这只是“声明”,不等于“生效”。真正决定扩展是否可用的,是运行时加载结果:
extension_loaded('mbstring') 返回 true,才代表该扩展函数(如 mb_strlen())能安全调用opcache)在 php.ini 中启用后,还需重启 Web 服务(Apache/Nginx + PHP-FPM)才生效;而 dl() 动态加载已被大多数现代 PHP 环境禁用(disable_functions = dl),不可依赖pdo_mysql 需要先加载 pdo,否则即使 pdo_mysql.so 存在,extension_loaded('pdo_mysql') 仍为 false
所以线上环境做扩展兼容性检查时,务必用 extension_loaded() 封装关键依赖,而不是读配置文件。
扩展名不是随便写的字符串,必须和 PHP 内部注册名完全一致:
gd,不是 gd2 或 php_gd;Windows 下可能是 php_gd2.dll,但 extension_loaded() 参数仍是 'gd'
mysql(已废弃)和 mysqli 是两个独立扩展,extension_loaded('mysql') 在 PHP 7.0+ 永远返回 false
intl 扩展在某些 Docker 镜像中默认不启用,即使 php -m 列出它,也要确认 extension=intl 出现在正确的 php.ini 中,且系统已安装 libicu 库最稳妥的方式永远是:先用 php --ini 定位配置文件,再用 php -m | grep -i xxx 粗筛

php -r "var_dump(extension_loaded('xxx'));" 实锤。