phpEnv 中无法启用 dl() 函数,因 PHP 7.0+ 已在 FPM/Apache 等 Web SAPI 中废弃该函数,enable_dl=On 仅对 CLI 生效;应通过 php.ini 配置 extension 加载扩展。

phpEnv 中无法真正启用 dl() 函数用于网页环境 —— 它在 PHP 7.0+ 的 FPM/Apache SAPI 下根本不可用,即使你改了 enable_dl=On。
为什么 phpEnv 里改了 enable_dl=1 也没用
phpEnv 是基于 Windows 的多版本 PHP 环境管理工具,底层通常使用 PHP-FPM 或 Apache 模块(如 mod_php)。而 dl() 自 PHP 7.0 起已被明确废弃于 Web SAPI:
-
enable_dl配置仅对 CLI 和 Embed SAPI 生效,FPM 和 Apache 模块下该指令被忽略 - 即使你在 phpEnv 的
php.ini中设为enable_dl = On,调用dl("redis")仍会直接报错:Call to undefined function dl()或触发E_WARNING: dl() has been disabled for security reasons - phpEnv 启动的 PHP 进程默认是 FPM 模式,不是 CLI,所以不满足
dl()的运行前提
如何确认当前 PHP SAPI 是否支持 dl()
在 phpEnv 管理的站点中执行以下代码,快速判断实际运行环境:
echo PHP_SAPI;
结果为 fpm-fcgi、apache2handler 或 cgi-fcgi → 不支持 dl();只有输出 cli 才可能生效(需手动在命令行运行脚本)。
还可加一行验证:
var_dump(function_exists('dl'));
返回 false 即代表该 SAPI 已硬编码禁用,改 php.ini 无效。
替代方案:别依赖 dl(),改用标准扩展加载流程
phpEnv 的本质是帮你切换不同 PHP 版本和配置,而不是绕过 PHP 安全机制。真正可靠的扩展加载方式只有一种:
- 把扩展 DLL 文件(如
php_redis.dll)放进 phpEnv 对应版本的ext/目录(路径类似:C:\phpenv\versions\8.2.12\ext\) - 编辑该版本的
php.ini,取消注释或新增:extension=php_redis.dll - 重启 phpEnv 的 Web 服务(如 Nginx/Apache)或 FPM 进程
- 用
extension_loaded("redis")或phpinfo()确认加载成功
注意:Windows 下扩展名必须是 .dll,且文件位数(x86/x64)、线程安全(TS/NTS)必须与当前 PHP 严格匹配,否则加载失败且无明确提示。
如果你坚持要在 CLI 下试 dl()
仅限调试用途,且必须满足全部条件:
- 用 phpEnv 切换到目标 PHP 版本后,在终端中执行:
phpenv exec php -v确认 CLI 版本 - 确保对应版本
php.ini中enable_dl = On(CLI 模式下该配置才起作用) - 扩展文件必须放在
extension_dir指向的目录中,且传给dl()的参数是纯文件名(如dl("php_redis.dll")),不能带路径 - PHP 8.0+ 已完全移除
dl(),哪怕 CLI 下也不存在 —— 此路在较新版本 phpEnv 中已彻底堵死
真实项目里,动态加载扩展这个需求本身就不该出现在运行时;它暴露的是部署流程缺陷。把扩展固化进 php.ini 并通过 phpEnv 统一管理版本,才是稳定、可复现的做法。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











