最稳入门路径是直接用frankenphp run启动并显式加--workers参数;需用frankenphp php-cli -m核对扩展,缺则换带扩展的二进制;用Caddyfile替代Nginx配置,关键设php_host localhost:8080。

直接用 frankenphp run 启动项目,别配 Nginx、别碰 php-fpm.conf、也先别开 worker 模式——这是最稳的入门路径。
确认你的 PHP 扩展是否已内置
FrankenPHP 二进制是静态链接的,自带一套 PHP 运行时和常用扩展,但不是全量。你得先验证 Laravel 或你的框架真正依赖的扩展是否就位:
- 运行
frankenphp php-cli -m查看已启用模块,重点核对:pdo_mysql、mbstring、openssl、json、xml、ctype、fileinfo、intl、redis(如果用了 Redis) - 若缺
gd或zip,Docker 用户可用install-php-extensions补;Linux 二进制用户需重下带对应扩展的 release 版本(如frankenphp-with-gd) - 别指望
pecl install—— FrankenPHP 不支持运行时动态加载扩展
用 Caddyfile 替掉全部 Nginx + FPM 配置
FrankenPHP 默认监听 localhost:8080 并自动服务 public/ 目录,但生产环境必须用 Caddyfile 显式声明行为,否则 HTTPS、重写、静态文件都不可控:
- 最小可行
Caddyfile长这样:
localhost root * /path/to/your/project/public php_host localhost:8080 file_server
-
php_host是关键:它告诉 Caddy 把 PHP 请求转发给内置 PHP 运行时(不是外部 FPM),值固定为localhost:8080(FrankenPHP 默认监听地址) - 删掉所有
fastcgi_pass、location ~ \.php$这类 Nginx 语法——Caddy 不认 - 别把
Caddyfile放错位置:必须在项目根目录,或通过-c参数显式指定路径
启动时别跳过 --workers 参数
哪怕你暂时不打算用常驻内存模式,也要显式加 --workers 启动:
立即学习“PHP免费学习笔记(深入)”;
- 正确命令:
frankenphp run --workers - 不加
--workers会退化成 classic 模式(每次请求重启 PHP 生命周期),性能和 PHP-FPM 差不多,完全没发挥 FrankenPHP 优势 - worker 模式默认只启 1 个 worker 进程,足够跑通 Laravel;后续压测再调
--workers=4或结合--max-requests - 注意:Laravel 项目必须确保
public/index.php是唯一入口,且没做任何全局变量污染(比如在bootstrap/app.php里写$GLOBALS['xxx'] = ...),否则 worker 复用时会出状态泄漏
最容易被忽略的是 php_host 的语义——它不是指向一个外部服务,而是 FrankenPHP 内部通信的固定端点;还有就是 --workers 这个开关,不加它,你就只是换了个壳跑 PHP-FPM 而已。



















