FrankenPHP Homebrew版不读系统php.ini,必须用-e参数显式指定ZTS兼容的PHP 8.5扩展路径,并使用其内置phpize/php-config编译,加载后需重启进程且支持phpinfo需加--allow-phpinfo。

Homebrew安装的FrankenPHP不读php.ini,扩展加载路径和常规PHP不同
Homebrew安装的 frankenphp 是一个静态链接的独立二进制,它**不走系统PHP的配置链路**,也不会自动加载 /usr/local/etc/php/8.5/php.ini 或 extensions_dir 下的so文件。直接在php.ini里写 extension=hello.so 完全无效——这是最常踩的坑。
必须用 -e 参数显式指定扩展路径,且so需兼容ZTS+PHP 8.5
FrankenPHP Homebrew版内置的是 PHP 8.5 ZTS(线程安全)版本,你编译的扩展必须满足两个硬性条件:
- 编译时启用 ZTS:
./configure --enable-zts(不能漏) - PHP 版本号严格匹配:
phpize和php-config必须来自 FrankenPHP 自带的 PHP(不是系统PHP) - 扩展 .so 文件路径不能含空格或特殊字符,推荐放在
~/frankenphp-exts/这类干净路径下
启动服务时,用 -e 指向你的扩展:
frankenphp php-server -r public/ -e ~/frankenphp-exts/hello.so
多个扩展可重复使用 -e:
立即学习“PHP免费学习笔记(深入)”;
frankenphp php-server -r public/ -e ext1.so -e ext2.so
如何获取 FrankenPHP 自带的 phpize / php-config
Homebrew 安装后,FrankenPHP 的 PHP 工具链藏在内部,不能直接调用系统命令。正确做法是:
- 先查 FrankenPHP 二进制位置:
which frankenphp(通常是/opt/homebrew/bin/frankenphp) - 它的 PHP 资源实际解压在:
/opt/homebrew/Cellar/frankenphp/*/libexec/(用ls /opt/homebrew/Cellar/frankenphp/确认最新子目录) - 进入该目录后,你会看到
phpize、php-config、bin/php等——这些才是你要用的 - 编译扩展时,务必指定完整路径:
/opt/homebrew/Cellar/frankenphp/0.12.0/libexec/phpize
验证扩展是否真被加载
光看启动日志不够,因为 FrankenPHP 不会报“extension not found”这种错误。可靠验证方式只有两个:
- 在 PHP 脚本里调用
get_loaded_extensions(),检查返回数组是否含你的扩展名 - 访问
http://localhost:8080/?phpinfo=1(前提是你的路由脚本支持),搜索扩展名或对应函数(如hello_test()) - 注意:FrankenPHP 默认禁用
phpinfo()输出,需在php-server启动时加--allow-phpinfo才能触发
最容易被忽略的一点:FrankenPHP 的扩展加载是「启动时快照」,改了so文件或加了新 -e 参数,必须重启整个 php-server 进程,热重载不生效。



















