frankenphp 1.4 的 http 请求超时必须由 caddy 统一管理,caddyfile 中 php timeout 设定全生命周期上限(如45s),php.ini 的 max_execution_time 应小3–5秒(如40s),并为 curl、pdo、redis 等外部调用显式配置超时,同时合理设置 max_wait_time(2s~5s)和 health_timeout 防雪崩。

FrankenPHP 1.4 本身不提供 HTTP 请求超时控制能力,所有面向客户端的请求超时必须由前端 Web 服务器(通常是 Caddy)统一管理。PHP 层无法主动中断已被 Caddy 判定为超时的连接,所以配置必须聚焦在 Caddy 层,并与 PHP 运行时、外部调用协同。
Caddyfile 中设置全局请求超时
这是最关键的一层。在 Caddyfile 的 php 指令块中,使用 timeout 显式声明整个 HTTP 生命周期上限:
- 例如:
php timeout 45s表示从接收首字节到响应完成(含脚本执行、I/O 等)最长允许 45 秒 - 该值应略大于你预期的最长业务耗时(如导出报表、批量处理),但绝不能设为
0或过大(如300s) - 一旦超时,Caddy 直接断开连接,返回 504;此时 PHP 脚本即使还在运行,也失去意义
同步调整 php.ini 的 max_execution_time
它不是替代项,而是第二道防线——只约束 PHP 脚本内部逻辑执行时间,不涵盖网络等待或空闲连接:
- 建议设为比 Caddy
timeout小 3–5 秒,例如 Caddy 是45s,这里设max_execution_time = 40 - 避免在代码中调用
set_time_limit(0):FrankenPHP 不支持真正“永不过期”,Caddy 仍会强制切断 - 对长任务(如异步导出),应在关键步骤主动检查耗时并退出:
if (time() - $start > 35) { throw new \RuntimeException('Timeout'); }
为外部调用单独配置超时
cURL、PDO、Redis 等外部依赖默认超时极长,它们不受 Caddy timeout 约束。一旦卡住,会独占 worker,拖垮后续全部请求:
-
cURL:必须显式设
CURLOPT_CONNECTTIMEOUT(连接建立)和CURLOPT_TIMEOUT(总耗时) -
PDO MySQL:DSN 中加入
&connect_timeout=5&read_timeout=10&write_timeout=10 -
Redis(如 Predis):配置
'timeout' => 2, 'read_write_timeout' => 3 - 禁止在循环中发起未设超时的第三方 API 请求
别漏掉 max_wait_time 和 health_timeout
这两个参数影响请求排队和 worker 健康,容易被忽略但直接决定是否雪崩:
-
max_wait_time控制新请求在队列中最多等多久才返回 503,推荐设为2s~5s,需配合num_threads和max_threads使用 -
health_timeout默认仅 5 秒,若你用了 SSE 或需保持长连接,必须同步调大,否则 Caddy 会误杀活跃 worker - 注意:Caddy 全局
timeout和max_wait_time是两层独立机制,要对齐,否则高优先级的 timeout 会先触发,让 max_wait_time 形同虚设
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











