frankenphp超时需分caddy层和php层调整:caddy层在php块设timeout(如120s),php层通过frankenphp块中php_ini设max_execution_time(如180),worker模式下需注意生命周期限制。

FrankenPHP 中 PHP 脚本执行超时,主要涉及两个层级:HTTP 请求处理超时(由 Caddy 控制)和PHP 运行时自身执行时限(由 FrankenPHP 内置 PHP 引擎控制)。两者需分别调整,缺一不可。
HTTP 层超时(Caddy 级别)
这是最常见、最先触发的超时点。FrankenPHP 基于 Caddy,所有入站请求先经过 Caddy 的路由与中间件链。若请求卡在 PHP 执行阶段太久,Caddy 会主动中断连接。
- 默认情况下,Caddy 的
reverse_proxy或php_server指令隐含 30 秒超时 - 需显式在 Caddyfile 的
php或php_server块中设置timeout
localhost {
php {
root /var/www
timeout 120s // 关键:延长 PHP 处理总时长
}
}
注意:
timeout是指从 Caddy 将请求交给 PHP 运行时开始,到收到完整响应为止的最大等待时间。超过即返回 504 Gateway Timeout。
PHP 执行层超时(FrankenPHP 内置运行时)
即使 Caddy 允许更久,PHP 自身也可能因 max_execution_time 中断脚本。FrankenPHP 使用嵌入式 PHP,其 ini 设置可通过以下方式覆盖:
-
在 Caddyfile 的
frankenphp全局块中用php_ini指令注入:{ frankenphp { php_ini "max_execution_time=180" php_ini "memory_limit=512M" } } 或在应用目录下放
.user.ini(仅对 classic 模式生效,worker 模式下该值在进程启动时固化,需重启生效)
Worker 模式下的额外注意点
启用 worker 模式后,PHP 脚本常驻内存,max_execution_time 不再按请求重置,而是作用于单次 worker 启动后的整个生命周期。此时更推荐:
- 把耗时逻辑拆成异步任务(如用 Fiber +
sleep()或队列) - 在代码中主动检查
microtime(true)或使用set_time_limit(0)(仅限 worker 主循环内安全使用) - 避免在 worker 初始化阶段执行无界阻塞操作
快速验证是否生效
修改配置后重启 FrankenPHP,然后用一个故意延时的脚本测试:
<?php // test-timeout.php
sleep(90);
echo "done at " . date('H:i:s');访问该脚本,观察是否返回内容,或是否收到 504(说明 Caddy timeout 生效)、500(可能 PHP ini 限制触发 fatal error)。
- 若返回 504 → 调大 Caddy 的
timeout - 若返回 500 或空白 → 检查
php_ini是否正确加载,或查看frankenphp.log中的 PHP 错误日志
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











