PHP探针如何判断扩展是否开启_PHP探针判断扩展开启方法【指引】
技术百科
絕刀狂花
发布时间:2026-01-18
浏览: 次 最直接可靠的方式是用 extension_loaded() 检查普通扩展,参数为小写内部名(如 'curl');Zend 扩展需通过函数或常量判断(如 opcache_get_status())。
用 extension_loaded() 检查扩展是否启用
最直接、最可靠的方式是调用 PHP 内置函数 extension_loaded(),它返回布尔值,无需解析配置或读文件。
注意:函数名区分大小写,参数是扩展的「内部名称」,不是 .so 或 .dll 文件名,也不是 php.ini 里写的 extension= 后半段(比如 mysqli 不是 php_mysqli.dll)。
-
extension_loaded('curl')✅ 正确(Windows/Linux 通用) -
extension_loaded('php_curl')❌ 错误(这是 Windows 下旧式 DLL 名) -
extension_loaded('gd2')❌ 错误(GD 扩展的内部名就是gd) -
extension_loaded('openssl')✅ 正确(即使php.ini写的是extension=php_openssl.dll)
if (extension_loaded('redis')) {
echo 'Redis 扩展已启用';
} else {
echo 'Redis 扩展未启用,请检查 php.ini 或安装';
}
用 get_loaded_extensions() 批量判断多个扩展
当探针需要一次性检查十几个扩展(如 mbstring、json、pdo_mysql)时,反复调用 extension_loaded() 效率低;更优做法是先获取全部已加载扩展列表,再用 in_array() 查找。
该函数返回索引数组,所有扩展名均为小写,不带版本后缀(如 intl 不是 intl-4.0.0)。
- 性能更好:只需一次内核扫描,后续是数组查找
- 避免大小写陷阱:统一转小写比对更安全
- 注意:
get_loaded_extensions(true)返回关联数组(按模块分类),探针中一般不用
$loaded = array_map('strtolower', get_loaded_extensions());
$required = ['curl', 'mbstring', 'json', 'pdo'];
foreach ($required as $ext) {
if (in_array($ext, $loaded)) {
echo "[✓] {$ext}\n";
} else {
echo "[✗] {$ext}\n";
}
}
别依赖 phpinfo() 或解析 php.ini
phpinfo() 虽能显示扩展状态,但输出是 HTML,不可靠用于程序判断——它可能被禁用(disable_functions=phpinfo),也可能因权限问题无法执行;而手动读取 php.ini 更危险:路径不确定(php --ini 输出多个)、格式不规范(分号注释、空格缩进、include 指令)、且「已写入」不等于「已生效」。
真实场景中常见坑:
- 开发环境启用了
opcache,但生产环境没重启 PHP-FPM,php.ini改了也没用 - 使用 Docker 时,
php.ini在容器内,探针脚本在宿主机运行,根本读不到 -
extension=xxx.so行前有空格或中文字符,导致解析失败
结论:只信运行时结果,不信配置文件内容。
注意 Zend 扩展(如 OPcache、Xdebug)不能用 extension_loaded()
Zend 扩展(zend_extension=)和普通扩展(extension=)加载机制不同,extension_loaded() 对它们始终返回 false。
正确检测方式是查 zend_ini_string() 或遍历 php_ini_scanned_files() 后手动解析,但最简单可靠的做法是检查其提供的函数或常量是否存在:
-
opcache_get_status()存在 → OPcache 已启用 -
function_exists('xdebug_info')或defined('XDEBUG_VERSION')→ Xdebug 已加载 -
extension_loaded('swoole')仍适用——Swoole 是普通扩展,不是 Zend 扩展
别

# 的是
# 这是
# 加载
# 多个
# windows
# 只需
# 均为
# 机运
# redis
# 扩展名
# linux
# js
# json
# docker
# cURL
# html
# php
# 遍历
# mysql
# 不信
# 常量
# include
# mysqli
# swoole
# 关联数组
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何在 Go 中调用动态链接库(.so)中的函数
- Win10怎样设置多显示器_Win10多显示器扩展
- c++ atoi和atof函数用法_c++字符数组
- 如何使用Golang benchmark测量函数延
- Win10如何卸载预装Edge扩展_Win10卸载
- 如何提升Golang JSON序列化性能_Gola
- 如何使用 Selenium 正确获取篮球参考网站球
- 如何在Golang中处理云原生事件_使用Event
- Win11怎么更改任务栏颜色_Windows11个
- Win11关机界面怎么改_Win11自定义关机画面
- Win11怎么开启游戏模式_Windows11优化
- 如何在 VS Code 中正确配置并使用 NumP
- Win11怎么关闭自动修复_跳过Win11开机自动
- Win11怎么关闭系统推荐内容_Windows11
- 如何使用Golang实现错误包装与传递_Golan
- 如何使用正则表达式批量替换重复的“-”模式为固定字
- 如何使用Golang table-driven基准
- 如何在 Go 同包不同文件中正确引用结构体
- Win11如何关闭游戏模式 Win11禁用Xbox
- PHP主流架构如何处理会话管理_Session与C
- Win10怎样清理C盘爱奇艺缓存_Win10清理爱
- php8.4匿名类怎么用_php8.4匿名类创建与
- 如何使用Golang管理模块版本_Golanggo
- 如何在 IIS 上为 ASP.NET 6 应用排除
- Python配置文件操作教程_JSONINIYAM
- Win11怎么关闭自动更新 Win11永久关闭系统
- MySQL 中使用 IF 和 CASE 实现查询字
- Mac的Time Machine怎么用_Mac系统
- Python模块的__name__属性如何由导入方
- MAC怎么设置程序窗口永远最前_MAC窗口置顶插件
- Win11开机自检怎么关闭_跳过Win11开机磁盘
- mac怎么退出id_MAC退出iCloud账号与A
- Win11怎么设置虚拟桌面 Win11新建多桌面切
- 如何使用Golang管理跨项目依赖_Golang多
- 小程序里php怎么变mp4_小程序调用php生成m
- php嵌入式多设备通信怎么实现_php同时管理多个
- php中$this和::能混用吗_对象与静态作用域
- 如何使用Golang读取日志文件_Golang b
- PHP怎么接收前端传的时间戳_处理时间戳参数转换技
- 如何在Golang中写入XML文件_生成符合规范的
- 如何在Golang中处理模块冲突_解决依赖版本不兼
- c# 在ASP.NET Core中管理和取消后台任
- c++怎么使用std::unique实现去重_c+
- Win10怎么查看内存时序参数_Win10CPU-
- Win11如何设置省电模式 Win11开启电池节电
- 如何使用Golang sync.Map实现并发安全
- Win11键盘快捷键大全_Windows 11常用
- Win11怎么设置指纹解锁 Win11笔记本录入指
- Win11怎么恢复误删照片_Win11数据恢复工具
- Win11怎么更改电脑名称_Windows 11修

QQ客服