frankenphp_handle_request必须在while(true)循环中调用,每次仅处理一个请求并返回psr-7响应实例;框架初始化(如laravel的$app=require_once)须在循环外执行一次,回调内只处理请求、清理资源并显式触发gc_collect_cycles()。

frankenphp_handle_request 必须放在循环里调用
它不是一次性的请求处理器,而是 worker 模式下的“请求接收器”——每次调用只处理一个请求,返回后必须再次调用才能处理下一个。不加循环,你的服务只能响应一次就退出。
- 入口文件(如
public/index.php)开头要写while (true) { ... }或for (;;) { ... } -
frankenphp_handle_request()的参数是一个 callable,即回调函数,不能直接传业务逻辑代码 - 回调必须返回一个符合
Psr\Http\Message\ResponseInterface的实例,不能echo后就结束,也不能exit或die - Laravel 用户常见错误:在回调里调用了
$kernel->terminate($request, $response)却忘了$response->send(),结果响应体为空
回调里不能初始化框架,只能处理请求
worker 模式下,PHP 进程常驻,框架启动(如 Laravel 的 require bootstrap/app.php)只需做一次,在循环外完成;否则每次请求都重建容器,失去性能优势,还可能引发类重复定义错误。
- 正确结构:
$app = require_once __DIR__.'/bootstrap/app.php'; // 一次 $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); while (true) { frankenphp_handle_request(function ($request) use ($kernel, $app) { $response = $kernel->handle($request); $kernel->terminate($request, $response); return $response; // 注意:必须 return,不能 send() 后 return null }); } - ThinkPHP 6/8 要特别注意:
$http->run()必须在回调内执行,且之后必须紧跟$http->end($response),否则连接不关闭,curl 会卡住 - 别在回调里改全局状态(比如给
static $cache = []写数据),这个变量会在下次请求时还在
不返回 ResponseInterface 就会崩溃
FrankenPHP 严格校验回调返回值类型。如果你返回 string、array 或 null,进程会直接 panic 并退出,日志里通常只显示 panic: interface conversion 这类模糊提示。
- 常见假修复:用
new \Zend\Diactoros\Response()—— 但 Laravel 默认不装这个包,得手动composer require laminas/laminas-diactoros - 更稳妥的做法是复用框架自带的响应构造方式,例如 Laravel 中
response('hello')->send()是错的(send()直接输出并返回null),应改为response('hello')(返回实例) - 如果用 Slim 或其他 PSR-7 实现,确认你用的是同一套消息接口,避免混用
nyholm/psr7和guzzlehttp/psr7导致类型不兼容
容易被忽略的资源清理点
FrankenPHP 不会自动帮你重置 PHP 运行时上下文,残留状态(数据库连接、静态缓存、超全局变量)会跨请求延续,这是 worker 模式最隐蔽的坑。
- 每次回调执行完,建议显式调用
gc_collect_cycles(),尤其在处理大数组或对象图后 - Laravel 用户应在回调末尾加:
$app->resetResolvedInstances(); $app->forgetInstance('request'); - 数据库连接必须断开或禁用持久化:
PDO::ATTR_PERSISTENT => false,或在回调结尾调用DB::disconnect() - 别依赖
$_SERVER['REQUEST_URI']做路由判断——FrankenPHP 构造的值可能和你预期不同,优先用 PSR-7$request->getUri()->getPath()
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











