frankenphp安装只需一个预编译二进制,内置caddy服务器、php运行时及常用扩展;而php-fpm需分别部署nginx、php-fpm服务及系统级php.ini配置,步骤繁琐且易出错。

FrankenPHP 安装只需一个二进制,PHP-FPM 需要三套独立组件
传统 PHP-FPM 部署不是“装一个东西”,而是必须协调 Nginx(或 Apache)、PHP-FPM 服务、系统级 php.ini 和扩展配置。比如 Ubuntu 上要分别执行 apt install nginx php-fpm php-mysql,再手动改 /etc/php/*/fpm/pool.d/www.conf、/etc/nginx/sites-available/default,最后 systemctl enable nginx php8.2-fpm。漏一步就 502。
FrankenPHP 只需下载单个二进制:frankenphp,它已经内置了 Web 服务器(Caddy)、TLS 终止、PHP 运行时和所有常用扩展(如 curl、json、mbstring)。你不需要额外装 Nginx,也不用配 fastcgi_pass 或 Unix socket 权限。
- 官方提供预编译二进制,Linux/macOS/Windows 均支持,直接
chmod +x frankenphp && ./frankenphp就能跑 - Docker 用户可直接用
docker run -p 8000:8000 -v $(pwd):/app dunglas/frankenphp,无需自定义Dockerfile - 如果你用
php --version查到的是系统 PHP,那和 FrankenPHP 完全无关——它自带 PHP 8.2+ 运行时,不依赖系统 PHP
PHP-FPM 的 www.conf 和 php.ini 在 FrankenPHP 里怎么替代
FrankenPHP 不读系统 php.ini,也不认 www.conf。它的配置全靠一个 Caddyfile 或环境变量驱动。
比如 PHP-FPM 里常用的 pm.max_children = 50,在 FrankenPHP 中对应的是 FRANKENPHP_WORKERS=50;而 upload_max_filesize 这类 ini 设置,得写进 Caddyfile 的 php_options 块里:
localhost:8000 {
root * /app/public
php
php_options {
upload_max_filesize 100M
post_max_size 100M
}
}
-
php_options支持绝大多数php.ini指令,但不包括扩展加载(extension=),因为 FrankenPHP 已静态链接常用扩展 - 没有
pool概念,所以不用配slowlog、access.log——日志统一走 Caddy 的log指令 - 想开 HTTP/3?不用装
nghttp3或改内核参数,FrankenPHP 默认启用,只要加tls块并有证书就行
SSL 证书续期在两种方案里差在哪
PHP-FPM 方案中,证书管理完全交给 Nginx 或 certbot,你需要单独配置 certbot renew --nginx,还要 reload nginx,稍有延迟就导致 HTTPS 中断。
FrankenPHP 内置 Caddy,自动完成 ACME 流程:只要域名解析生效,启动时加 tls yourdomain.com,它会自动申请、续期、热更新证书,全程零人工干预。
- 本地开发可用
tls internal,自动生成可信的本地证书,浏览器不报错 - 若已有证书,可直接挂载到容器或指定路径:
tls /path/to/cert.pem /path/to/key.pem - 注意:FrankenPHP 不支持通配符证书的 DNS-01 挑战(除非自己写插件),ACME 默认走 HTTP-01,需确保 80 端口可访问
为什么 systemctl start php8.2-fpm 这类命令在 FrankenPHP 里根本不存在
FrankenPHP 是单进程模型,没有“FPM master + worker”分层,也没有 systemd service 文件模板。它不注册为系统服务,而是由你决定如何托管——可以写个简单的 systemd unit,也可以用 supervisord,甚至直接 nohup ./frankenphp &。
关键区别在于生命周期控制:PHP-FPM 的 pm.start_servers 控制预启 worker 数量;FrankenPHP 的 FRANKENPHP_WORKERS 控制的是 Go 协程数,每个协程复用同一个 PHP 执行上下文,不 fork 新进程。
- 这意味着你不能用
ps aux | grep php-fpm查到 FrankenPHP 进程——它显示为frankenphp,且只有一个主进程 - 没有
php-fpm.sock文件,所以不用操心listen.owner、listen.mode这些权限问题 - 升级时,停掉旧进程、换新二进制、重启即可,没有“平滑 reload”概念,但启动速度极快(毫秒级),影响几乎不可感
FrankenPHP 的安装差异本质是架构层级的收束:它把原来分散在四五个配置文件、三个服务进程里的职责,压进一个二进制和一个 Caddyfile。省掉的不是步骤,而是配置耦合点——每个点都是线上故障的潜在入口。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











