FrankenPHP无需单独安装PHP和Nginx,因其单二进制文件已静态链接内置PHP解释器(embed SAPI)和Caddy Web服务器,可直接处理HTTP、TLS、PHP执行等全部任务,替代Nginx、PHP-FPM、certbot等传统组件。

不需要,装了 FrankenPHP 就不用再单独装 PHP 和 Nginx。
FrankenPHP 自带完整 PHP 运行时和 Web 服务器
FrankenPHP 是一个单二进制文件,内部已静态链接了 PHP 解释器(embed SAPI)和 Caddy Web 服务器。它不是“调用系统 PHP”,而是把 libphp 直接编译进自身——所以你机器上有没有 php 命令、装没装 nginx、甚至删掉 /etc/php 都不影响它运行。
验证方式很简单:
- 执行
frankenphp php-cli -v可看到内置 PHP 版本 - 执行
frankenphp php-cli -m可列出所有已启用的扩展(如pdo_mysql、opcache) - 它监听 HTTP 端口、处理 TLS、转发请求、执行 PHP 脚本,全部由一个进程完成
哪些传统组件可以彻底下线
原来 Nginx + PHP-FPM 架构中以下部分全部被替代:
立即学习“PHP免费学习笔记(深入)”;
-
nginx进程 → 由 FrankenPHP 内置 Caddy 替代(支持 HTTPS 自动续期、HTTP/3、静态文件服务) -
php-fpm进程 → 不再需要,FrankenPHP 内部直接执行 PHP -
php.ini全局配置 → 改用frankenphp php-cli的参数或 Caddyfile 中的 PHP 指令控制 -
certbot+ 定时任务 → Caddy 自动管理 Let's Encrypt 证书
注意:php-fpm.conf、www.conf、Nginx 的 server 块、fastcgi_pass 等配置全部废弃,换成一份 Caddyfile 即可。
容易踩的坑:扩展缺失和路径错位
虽然 FrankenPHP 自带常用扩展,但不是“全量打包”。如果你的 Laravel 项目用了 ext-imagick 或 ext-sodium,而二进制里没包含,就会报 Class not found 或 extension not loaded。
解决办法只有两个:
- 用 Docker 镜像 +
install-php-extensions动态安装(推荐生产环境) - 自己从源码编译 FrankenPHP,指定所需扩展(开发/定制场景)
另外,FrankenPHP 默认工作目录是当前路径,public/、storage/、bootstrap/cache/ 的权限和路径必须对齐,否则会卡在 file_put_contents(/path/to/storage/logs/laravel.log): failed to open stream 这类错误上——它不读你系统里的 open_basedir 或 upload_tmp_dir,一切以运行时实际路径为准。
真正要盯住的不是“装没装 PHP”,而是“FrankenPHP 里有没有你要的扩展”和“你的项目路径是否被它正确识别”。其他全是冗余动作。



















