PHP PDO ODBC连接超时设置不生效问题求助
问题:PDO设置1秒连接超时却实际耗时18秒生效
核心原因
PDO::ATTR_TIMEOUT是PDO层面对数据库操作的超时限制,并非底层ODBC驱动的连接阶段超时,所以对SQL Server ODBC驱动的初始连接无效。
解决方案
1. 在ODBC连接字符串中添加驱动级超时参数
针对ODBC Driver 18 for SQL Server,需要使用LoginTimeout参数直接控制连接登录的超时时间,这是驱动层面的设置,优先级更高。
- 如果使用无DSN的连接方式,直接在连接字符串中指定参数;
- 如果使用系统DSN,需在DSN配置里添加
LoginTimeout=1。
2. 修改后的完整代码示例
<?php ini_set('display_errors', 1); error_reporting(E_ALL); $SERVER = "192.168.0.50"; $DATABASE = "MYDB"; const USERNAME = "username"; const PASSWORD = "password"; try { $db = new PDO( "odbc:Driver={ODBC Driver 18 for SQL Server};Server=$SERVER;Database=$DATABASE;LoginTimeout=1", USERNAME, PASSWORD, array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ) ); } catch (PDOException $e) { echo '<div class="alert alert-danger" role="alert">'; echo "Connection to database failed:" . PHP_EOL . $e->getMessage(); echo '</div>'; }
3. 额外说明
PDO::ATTR_TIMEOUT仅适用于连接建立后,执行查询、获取结果等数据库操作的超时控制,对初始连接的握手、登录阶段没有作用。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

