macos上frankenphp模块重复加载警告本质是同一扩展被多个.ini文件中的extension=指令重复启用,需用frankenphp -m和frankenphp --ini定位冲突文件,注释或删除冗余extension=行,再以frankenphp -v和frankenphp -m验证修复效果并重启实例。

macOS上FrankenPHP v1.2.1启动时出现类似“PHP Warning: Module 'curl' already loaded”的模块重复加载警告,本质是同一扩展被多个 .ini 配置文件中的 extension= 指令重复启用,需定位并删除冗余加载项,而非修改扩展本身。
确认重复加载的扩展名和来源
运行以下命令查看 FrankenPHP 实际加载的模块列表及对应配置路径:
frankenphp -m
该命令会启动最小化实例并输出真实启用的扩展——注意不是系统 php -m,它不读取 CLI 的 php.ini。若看到某扩展(如 curl、mbstring、opcache)重复出现在不同行,说明已被多次声明。
再用带来源信息的方式精确定位:
frankenphp --ini | grep "Loaded Configuration File"
记下输出的主配置文件路径(如 /opt/homebrew/etc/php/8.3/php.ini),然后执行:
grep -r "extension=" /opt/homebrew/etc/php/8.3/
这会列出所有含 extension= 的文件,包括主 php.ini、conf.d/ 下的独立 ini 文件(如 05-opcache.ini、10-curl.ini)。【重复加载一定源于这些文件中对同一扩展的多次 extension= 声明】
清理冗余的 extension= 加载项
方法一:只保留主 php.ini 中的 extension 声明,注释掉 conf.d/ 下所有同名扩展的 .ini 文件
进入 /opt/homebrew/etc/php/8.3/conf.d/ 目录,用 ls -l 查看有哪些扩展配置文件。若发现 10-curl.ini 和主 php.ini 中都写了 extension=curl,就直接编辑 10-curl.ini,在开头加分号注释整行:;extension=curl。
方法二:统一收口到 conf.d/,彻底删除主 php.ini 中的 extension 行
打开主 php.ini,搜索 extension=,把所有动态扩展相关的行(如 extension=mbstring、extension=pdo_mysql)全部删掉或注释。确保只保留 zend_extension=opcache 这类 Zend 扩展(它们不能放进 conf.d/)。然后确认 conf.d/ 下每个扩展对应一个独立 .ini 文件,且内容干净无重复。
注意:opcache 是 zend_extension,必须用 zend_extension=opcache 声明,不能写成 extension=opcache,否则会触发两次加载警告。
验证修复效果并重启
第一步:检查 FrankenPHP 启动是否不再报 warning
执行 frankenphp -v。如果输出中不再出现 “Module 'xxx' already loaded”,说明重复加载已消除。
第二步:确认扩展仍正常启用
运行 frankenphp -m | grep -E 'curl|mbstring|pdo',确保关键扩展名称仍在列表中。若缺失,说明删错了有效声明,需回退上一步操作。
第三步:重启 FrankenPHP 实例
若你正在后台运行 FrankenPHP(如通过 nohup 或 launchd),必须先终止旧进程再启动新实例。执行 pkill -f frankenphp 后重新运行你的服务命令。不杀旧进程,新配置不会生效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











