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免费学习笔记(深入)”;
-
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 内部注册名完全一致:
- Linux 下扩展名为
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'));" 实锤。











