PDO::ATTR_TIMEOUT是PDO层SQL执行超时(非连接超时),需在databases.php的MySQL配置中与'driver'同级配置'options' => [PDO::ATTR_TIMEOUT => 3];Swow环境下还需并列配置read_timeout/write_timeout。

在 Hyperf 3.1 中,PDO::ATTR_TIMEOUT 是 PDO 层的执行超时设置,用于控制 prepare() 和 execute() 等操作的最大等待时间(单位:秒),**不是连接建立超时**。它需配置在数据库配置的 'options' 数组中,且仅对 PDO 驱动生效。
正确配置位置与写法
在 config/autoload/databases.php 的 MySQL 配置块内,确保已启用 PDO 驱动('driver' => 'mysql'),然后在同级添加 'options':
-
'options' => [PDO::ATTR_TIMEOUT => 3]—— 表示 SQL 执行最长等待 3 秒,超时后抛出异常 - 该配置必须放在
'driver'同级,不能嵌套在'pool'或'params'内 - 若使用 Swow 引擎,此配置依然有效,但需注意 Swow 还有独立的
read_timeout/write_timeout(单位为秒,浮点数)
Swow 环境下的补充说明
当启用 Swow(SWOW_BASE)时,仅设 PDO::ATTR_TIMEOUT 不足以覆盖全部 I/O 场景。建议同步配置:
-
'read_timeout' => 5.0—— 网络读取超时,单位秒 -
'write_timeout' => 5.0—— 网络写入超时,单位秒 - 这两个参数需与
'options'并列,同属数据库驱动配置项
常见误区提醒
以下配置方式是错误或无效的:
- 把
PDO::ATTR_TIMEOUT放在'params'里 —— 它不作用于连接初始化,只影响语句执行 - 设为 0 或负数 —— PDO 会忽略,等效于无超时限制,易导致协程挂起
- 期望它控制连接池获取连接的等待时间 —— 实际由
'wait_timeout'(单位秒)控制,属于'pool'配置项


















