
PHP连接超时需分层配置,不同环节对应不同参数,不能只设一个“timeout”就以为全局生效。
数据库连接建立超时(PDO)
这是最易被忽略的一环。PDO本身不识别timeout字符串配置,必须显式传入属性:
- 在
config/database.php或Db::connect()中添加:'params' => [\PDO::ATTR_TIMEOUT => 5] - 单位是秒,不是毫秒;设为
0表示无限等待(危险) - 同时建议配
'break_reconnect' => true,断连后可自动重试 - ❌ 错误写法:
'timeout' => 5或'connect_timeout' => 5—— 完全无效
MySQL读写阶段超时(PDO扩展专属)
若使用 MySQL,可额外控制读、写行为:
-
PDO::MYSQL_ATTR_CONNECT_TIMEOUT => 5:TCP连接握手超时(秒) -
PDO::MYSQL_ATTR_READ_TIMEOUT => 10:从服务端读取响应超时(秒) -
PDO::MYSQL_ATTR_WRITE_TIMEOUT => 10:向服务端发送数据超时(秒)
这些需和ATTR_TIMEOUT一起写在 PDO 构造参数中,仅对 MySQL 生效。
HTTP请求超时(cURL / file_get_contents)
ThinkPHP 的 Http 类或原生函数不会继承 PHP 全局设置,必须手动指定:
- cURL 场景:
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); // 连接阶段上限(秒) curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 整个请求上限(秒)
-
file_get_contents场景:
必须用stream_context_create()注入超时,例如:$context = stream_context_create(['http' => ['timeout' => 30]]); file_get_contents('https://api.example.com', false, $context); - ⚠️
ini_set('default_socket_timeout', 30)对 HTTPS 请求可能失效,不推荐单独依赖。
PHP运行环境级超时(防脚本中断)
即使网络或数据库已设好,脚本仍可能因总耗时超限被终止:
- 修改
php.ini中的max_execution_time = 60(单位:秒) - Nginx 环境下还需加
fastcgi_read_timeout 60;到站点配置中 - Apache 环境下可用
php_admin_value max_execution_time 60 - CLI 脚本中可临时调用
set_time_limit(120)
连接池获取超时(仅 TP6.1+ & think-orm v3.0+)
如果启用了连接池(如 'pool' => ['max_active' => 10]),还要控制「取连接」这一步:
-
'pool' => ['get_timeout' => 1000]—— 单位是毫秒 - 它不影响新建连接,只管从已有池子里拿连接等多久
- TP5.x 和 TP6.0 完全不支持该配置,写了也无效
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











