可被 configure 阶段禁用的内置扩展包括:--disable-session(但会导致 soap 启动失败)、--disable-json(可能引发 panic)、--disable-phar(安全)、--disable-opcache(性能下降)、--without-curl(需确认 go 扩展无依赖)。

编译 FrankenPHP 时无法直接“关闭”内置 PHP 扩展,因为它的核心扩展(如 session、json、mbstring)是硬编码进构建流程的;但你可以通过 configure 选项禁用部分可选模块,或在运行时用 php.ini 层级控制加载行为。
哪些内置扩展能真正被 configure 阶段禁用
FrankenPHP 基于 PHP 源码构建,因此继承了 PHP 官方的 --disable-xxx 编译开关。但并非所有扩展都支持——只有明确标记为“可选”且未被 FrankenPHP 强依赖的,才可安全禁用:
-
--disable-session:可禁用,但注意SOAP扩展会因缺失 session 依赖而启动失败(见 2024 年不兼容变更) -
--disable-json:FrankenPHP 自身不强制依赖,但多数 Go 扩展桥接层会用到 JSON 序列化,禁用后可能触发 panic -
--disable-phar:安全,除非你用phar://协议加载 PHP 脚本 -
--disable-opcache:可禁用,但会显著降低 PHP 代码执行性能;注意zend_extension=opcache.so在运行时仍可加载 -
--without-curl:若你的 Go 扩展不调用net/http或 cgo curl 绑定,可禁用
为什么不能像传统 PHP 那样注释 extension= 行
FrankenPHP 的构建过程会把部分扩展(如 standard、core、date)静态链接进二进制,它们没有对应的 .so 文件,也不会出现在 php -m 输出里。你在 php.ini 中注释 extension=mbstring.so 是无效的,因为该模块根本没被编译成动态库——它已经 baked in 了。
验证方式:php -m | grep mbstring 有输出 ≠ 动态加载,很可能是静态内置。此时 php --ini 查到的 Loaded Configuration File 里无论怎么改 extension 行,都无影响。
真正有效的运行时控制手段
编译阶段做不到的,得靠运行时配置和 Go 层干预:
- 对动态扩展(如
redis、pdo_mysql),仍可在php.ini中注释extension=redis.so并重启 FrankenPHP 进程 - 用
frankenphp.RegisterExtension()在 Go 代码中只注册你真正需要的自定义扩展,避免无意暴露冗余函数 - 若某内置扩展引发冲突(如
xml和 Go 的encoding/xml行为不一致),可在 Go 初始化逻辑中调用php_unregister_extension("xml")(需自行封装 Zend API 调用,非常规操作,风险高) - 检查
phpinfo()页面中 “Additional .ini files parsed” 列出的所有文件,确保没有 conf.d/ 下残留的extension=行——FrankenPHP 会全量扫描这些目录
容易被忽略的关键点
FrankenPHP 的 php.ini 加载顺序和传统 PHP 不同:它优先读取二进制同目录下的 php.ini,其次才是环境变量 PHPRC 指向的路径。很多人改了 /etc/php/8.3/cli/php.ini 却发现没生效,就是因为 FrankenPHP 根本没加载那个文件。
另一个坑是:某些扩展(如 opcache)即使被 --disable-opcache 掉,其 Zend opcode 缓存机制仍可能被 FrankenPHP 的 Go 层间接启用——这取决于你是否调用了 frankenphp.WithOPCache() 等选项。最终行为得看 Go 初始化代码,不是 configure 参数说了算。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











