frankenphp 1.4 的请求超时需通过caddy配置层统一控制,核心是caddyfile中php块的timeout指令(如timeout 30s),并协同php.ini的max_execution_time及curl等外部调用的独立超时设置,形成三层超时防护机制。

Caddy 全局请求超时(最常用)
Caddy 的 `timeout` 指令可限制单个 HTTP 请求从接收首字节到响应完成的总耗时。在 `Caddyfile` 中添加或修改 `reverse_proxy` 或 `php` 处理块:示例(使用 php 指令):
localhost {
route {
php {
root /var/www
timeout 30s // ← 关键:整个 PHP 请求处理上限为 30 秒
}
}
}
该 timeout 会作用于 FrankenPHP 启动的 PHP Worker 处理全过程(包括脚本执行、I/O 等)。若超过此值,Caddy 主动断开连接并返回 504 Gateway Timeout。
PHP 脚本级执行超时(配合生效)
FrankenPHP 运行的是标准 PHP 环境,所以传统 PHP 超时设置依然有效,且需与 Caddy timeout 协调:- 确保 php.ini 中的
max_execution_time小于 Caddy 的 timeout 值(例如设为25),避免 PHP 自行中止前 Caddy 已超时 - 在关键长任务脚本开头加:
ini_set('max_execution_time', 25);或set_time_limit(25); - 注意:FrankenPHP 不支持
set_time_limit(0)彻底禁用超时,因 Caddy 层仍会强制切断
Worker 级空闲与连接超时(进阶)
FrankenPHP 的 Worker 进程由 Caddy 管理,其空闲行为受 Caddy 的 `health_timeout` 和 `keepalive_idle` 控制:在 Caddyfile 的 `php` 块内可显式指定:
php {
root /var/www
timeout 30s
health_timeout 10s // Worker 无响应超时后重启
keepalive_idle 60s // 保持空闲连接最长 60 秒(适用于长轮询等场景)
}
这些参数影响 Worker 生命周期,间接决定“一次请求能等待多长时间才被判定失败”。
外部依赖超时不能忽略
如果你的 PHP 代码发起 cURL、PDO 连接或 socket 请求,这些操作的超时必须单独设置:- cURL:用
CURLOPT_TIMEOUT和CURLOPT_CONNECTTIMEOUT - PDO(MySQL):DSN 中加
&connect_timeout=5,或 PDO options 设PDO::ATTR_TIMEOUT - file_get_contents:配合
stream_context_create()设置timeout选项
timeout 入手,再逐层收紧下级超时,才能避免“看似没超时却卡死”的情况。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











