不可行,FrankenPHP无法将Laravel项目编译进二进制;它仅打包自身运行时(PHP引擎+Caddy),项目文件(public/、vendor/、.env等)必须以明文形式与二进制共存并动态加载。

FrankenPHP 不能把 PHP 项目“编译进”二进制,它打包的是一个运行时环境容器:PHP 解释器 + Caddy Web 服务器 + 你的明文 PHP 文件。最终产物是一个可执行文件,但 public/、vendor/、.env 等仍以原始形式存在,只是被一起分发。
frankenphp build 命令只打包运行时,不打包你的 PHP 代码
执行 frankenphp build 时,它只会把 FrankenPHP 自身(含嵌入的 PHP 运行时和 Caddy)编译成单个二进制,比如 myapp。它**完全不读取也不打包**你项目里的 app/、config/ 或 public/index.php —— 那些文件必须在运行时由 FrankenPHP 动态加载。
- 常见错误现象:运行生成的
myapp报错file not found: public/index.php,是因为当前目录下没有public/ - 正确做法:把
myapp和你的完整项目目录(含public/、vendor/、.env)放在一起,再运行 - 路径敏感:FrankenPHP 默认从当前工作目录找
public/,不是从二进制所在路径;所以cd /path/to/my-project && ./myapp才有效
Caddyfile 必须单独存在,不能塞进二进制
Caddyfile 是运行时配置文件,FrankenPHP 启动时会自动读取当前目录下的 Caddyfile(或通过 -config 指定)。它不会被编译或打包进 myapp 里。
- 典型内容必须包含
php_server块和root路径,例如:localhost { root * public/ php_server } - 如果用域名部署,
frankenphp build --server-name example.com只影响 HTTPS 证书申请域名,不影响Caddyfile内容本身 - 容易踩的坑:Caddyfile 里写死绝对路径如
/app/public,但部署时解压到/opt/myapp就会 404;应统一用相对路径public/
php.ini 是硬编码在二进制里的,改不了
官方 FrankenPHP 二进制(Linux/macOS)内置了 PHP 运行时,其 php.ini 路径和内容是编译时固定的,运行时无法用 -c 或环境变量替换。
立即学习“PHP免费学习笔记(深入)”;
- 验证方式:运行
./myapp php-cli -i | grep 'Loaded Configuration File',看到的路径是只读的(如/usr/local/lib/php.ini) - 想调
opcache.enable或memory_limit?只能重编译 FrankenPHP 源码,修改模板后make build - 生产建议:直接依赖官方二进制的默认值;敏感项(如
display_errors)改用应用层控制,比如 Laravel 的APP_DEBUG=false - 一个典型陷阱:把自定义
php.iniCOPY 到容器/usr/local/lib/,但 FrankenPHP 根本不读它
真正“打包成一个文件”的落地方式,是把 myapp、Caddyfile、public/、vendor/ 等全部塞进一个 tar.gz 或自解压脚本里,运行时自动解压并启动 —— 这才是你现在能立刻用起来的方案,而不是幻想 PHP 代码被编译进 Go 二进制。



















