PHP项目必知:如何查看已安装的PHP扩展(完整命令与实战指南)
📖 目录导读
- 为什么需要查看已安装的PHP扩展?
- 使用php -m命令(最常用)
- 通过phpinfo()函数查看(可视化)
- 使用get_loaded_extensions()函数(脚本内检测)
- 查看php.ini配置文件(全局控制)
- 常见问题与解答(FAQ)
- 如何在PHP项目中检测扩展是否安装?
- 总结与最佳实践
为什么需要查看已安装的PHP扩展?
在PHP项目开发、部署或迁移时,经常需要确认服务器上是否安装某个特定扩展。

- 你使用了
mysqli连接MySQL数据库,但服务器未安装该扩展,程序会直接报错。 - 项目依赖
gd库处理图片,但生产环境缺少该扩展,导致图片上传功能失效。 - 调试时想快速列出所有可用扩展,以便判断环境是否完整。
核心需求:快速、准确地获取当前PHP环境已加载的扩展列表,并定位缺失项。
方法一:使用php -m命令(最常用)
执行方式
打开终端或命令行,输入:
php -m
或查看更详细的版本与扩展信息:
php -i | grep -i "extension"
输出示例
[PHP Modules]
bcmath
calendar
Core
ctype
curl
date
dom
exif
fileinfo
filter
ftp
gd
gettext
...
优势
- 极速响应:直接列出所有已编译并加载的扩展。
- 无环境依赖:任何安装了PHP CLI的环境均可使用。
- 可配合grep过滤:例如
php -m | grep -i mysql快速查看MySQL相关扩展。
适用场景
SSH登录服务器后,快速诊断扩展安装状态。
方法二:通过phpinfo()函数查看(可视化)
操作步骤
- 在Web根目录创建一个
info.php文件。 - 写入以下代码:
<?php phpinfo(); ?>
- 在浏览器访问
http://yourdomain.com/info.php。 - 搜索“extension”或指定模块名(如“curl”)。
- 详细列出每个扩展的版本、编译参数、配置文件路径。
- 以表格形式展示,适合对比多个扩展的状态。
警告
部署后务必删除info.php,以免泄露服务器敏感信息(如Document Root、实际路径等)。
方法三:使用get_loaded_extensions()函数(脚本内检测)
PHP代码示例
$extensions = get_loaded_extensions();
foreach ($extensions as $ext) {
echo $ext . "\n";
}
进阶用法:检测单个扩展
if (in_array('mbstring', get_loaded_extensions())) {
echo "mbstring扩展已安装";
} else {
echo "请安装mbstring扩展";
}
优势
- 可在PHP代码内部动态检测,用于程序启动时的环境校验。
- 支持排序、分组(如过滤
core、standard等内置模块)。
适用场景
- 框架初始化时检查必须扩展是否齐全。
- 编写Composer脚本或安装向导时使用。
方法四:查看php.ini配置文件(全局控制)
查找php.ini文件位置
php --ini
或
php -i | grep "Loaded Configuration File"
查看扩展行
打开php.ini,搜索extension=或extension_dir:
extension=curl extension=gd2 extension=mbstring ;extension=zip ; 如果以分号开头,表示该扩展被禁用
注意
- 某些扩展(如PDO、mysqli)是编译时内置的,不会在
php.ini中显式列出。 - 动态加载的扩展(.so或.dll文件)会在此处体现。
常见问题与解答(FAQ)
Q1: php -m列出的扩展不全,缺少我需要的?
A: 可能原因:
- 扩展未安装(如
apt-get install php-mysql)。 - 安装了但未在
php.ini中启用(去掉分号并重启Web服务器)。 - 使用了多个PHP版本,
php -m指向的是CLI版本,而非FPM版本,需确认路径:/usr/bin/php7.4 -m与/usr/sbin/php-fpm7.4。
Q2: 如何区分内置扩展与动态加载扩展?
A: 执行php -m时,内置扩展通常列在[PHP Modules]下;动态扩展会在[Zend Modules]或[PHP Modules]中但标记为shared,更准确的方式是查看phpinfo()中的“Compiled as …”或“Loaded Modules”。
Q3: 在共享主机(cPanel等)上无法执行命令行怎么办?
A: 使用方法二(phpinfo()),或通过cPanel的“Select PHP Version”界面查看已选扩展列表,部分主机提供“PHP Extension Checker”工具。
Q4: 为什么get_loaded_extensions()与php -m结果不一致?
A: 可能因为:
- CLI与Web模块使用的
php.ini不同(查看php -i | grep php.ini)。 - 运行时禁用函数(
disable_functions)会影响部分扩展的加载。
如何在PHP项目中检测扩展是否安装?
安全启动检测(常用)
$required_extensions = ['pdo', 'pdo_mysql', 'json', 'mbstring'];
$missing = [];
foreach ($required_extensions as $ext) {
if (!extension_loaded($ext)) {
$missing[] = $ext;
}
}
if (!empty($missing)) {
die("缺少以下PHP扩展: " . implode(', ', $missing));
}
轮询检测(用于路由或中间件)
if (!function_exists('gd_info')) {
// 显示友好错误或重定向到安装帮助页
exit('图片处理功能不可用,请联系管理员安装gd扩展');
}
性能建议
- 将检测逻辑放在应用启动阶段(如框架的Bootstrap),避免每次请求都执行。
- 使用
extension_loaded()优于in_array()+get_loaded_extensions(),因为前者直接检查全局模块表,性能更高。
总结与最佳实践
| 方法 | 速度 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
php -m |
服务器端快速诊断 | 无需脚本,直接输出 | 无法区分内置/动态 | |
phpinfo() |
Web可视化查看 | 信息最全面 | 有安全风险,需删除 | |
get_loaded_extensions() |
代码内动态检测 | 可编程控制 | 占用内存(小量) | |
php.ini |
配置管理 | 可查看禁用项 | 无法显示内置扩展 |
最佳实践建议
- 日常排查:优先使用
php -m | grep 扩展名。 - 项目上线前:在配置文件中写入
required_extensions数组,并通过extension_loaded()循环检测,输出清晰的安装指引。 - 多环境管理:使用Docker或Vagrant时,可在Dockerfile中通过
RUN php -m生成扩展列表,作为镜像验证的一部分。 - 安全提醒:永远不要在公网可访问的目录保留
phpinfo()文件。
通过以上四种方法,您可以灵活应对各种场景下的PHP扩展查看需求,无论是简单列出所有扩展,还是精确检测某个模块的加载状态,都能在5秒内解决问题,建议将
php -m命令作为第一排查工具,结合代码内的extension_loaded()实现自动化环境校验,从而确保PHP项目的稳定性与兼容性。
延伸阅读:如果您需要安装PHP扩展,可使用pecl install(PECL扩展)或apt-get install php-XXX(Linux发行版包管理器),之后记得重启PHP-FPM或Apache/Nginx服务。