You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CentOS 9 Stream+PHP7.4连接SQL Server间歇性延迟/中断问题求助

问题分析与解决方案

1. 排查ODBC连接池与连接回收

间歇性连接问题大概率和连接池配置或连接未正确释放有关:

  • 编辑/etc/odbcinst.ini,检查ODBC Driver 17的连接池参数:
    [ODBC Driver 17 for SQL Server]
    Description=Microsoft ODBC Driver 17 for SQL Server
    Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.so.2.1
    UsageCount=1
    Pooling=Yes
    CPTimeout=120  # 连接池闲置超时(秒)
    MaxPoolSize=50 # 连接池最大连接数,需匹配SQL Server允许的连接数
    
  • 确保PHP代码中显式关闭SQL Server连接,避免依赖自动回收:
    // 使用sqlsrv扩展时
    sqlsrv_close($conn);
    // 使用odbc扩展时
    odbc_close($conn);
    

2. 优化CentOS TCP网络参数

报错中的TCP Provider: Error code 0x102表示连接超时/重置,调整TCP参数优化连接存活与复用:

  • 编辑/etc/sysctl.conf,添加以下配置:
    net.ipv4.tcp_keepalive_time=300    # 发送第一个保活包的间隔(秒)
    net.ipv4.tcp_keepalive_intvl=60    # 后续保活包间隔(秒)
    net.ipv4.tcp_keepalive_probes=5    # 重试次数
    net.ipv4.tcp_tw_reuse=1            # 允许复用TIME_WAIT状态的连接
    net.ipv4.tcp_fin_timeout=30        # FIN_WAIT2超时时间(秒)
    
  • 执行sysctl -p使配置生效。

3. 检查SQL Server端配置

  • 确认SQL Server已启用TCP/IP协议,监听端口正确(默认1433),并允许远程连接。
  • 查看SQL Server错误日志,排查是否存在连接数耗尽、登录失败或资源瓶颈记录。
  • 执行以下查询检查连接相关等待统计:
    SELECT wait_type, wait_time_ms, signal_wait_time_ms
    FROM sys.dm_os_wait_stats
    WHERE wait_type LIKE '%CONNECT%' OR wait_type LIKE '%NETWORK%'
    ORDER BY wait_time_ms DESC;
    
    若存在NETWORK_IO或LCK_M_*高等待,需针对性优化SQL Server资源或网络。

4. 验证PHP扩展与配置兼容性

  • 确认PHP sqlsrv/odbc扩展版本与PHP7.4兼容(sqlsrv推荐5.9.x版本),可通过php -m | grep sqlsrv查看版本。
  • 调整php.ini中的超时参数:
    max_execution_time=300       # 脚本最大执行时间
    default_socket_timeout=60    # 套接字默认超时时间
    

5. 稳定性测试脚本

编写循环测试脚本验证连接稳定性:

<?php
$serverName = "tcp:你的SQLServer_IP,1433";
$connectionOptions = [
    "Database" => "你的数据库名",
    "Uid" => "用户名",
    "PWD" => "密码"
];

for ($i = 0; $i < 100; $i++) {
    $conn = sqlsrv_connect($serverName, $connectionOptions);
    if ($conn) {
        echo "连接 $i 成功\n";
        sqlsrv_close($conn);
    } else {
        echo "连接 $i 失败: ";
        print_r(sqlsrv_errors());
        echo "\n";
    }
    sleep(1);
}
?>

执行脚本时同步监控SQL Server连接数变化,定位问题触发点。

内容的提问来源于stack exchange,提问作者kim seong su

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:27:28