在Laravel 7.30中启用MARS连接SQL Server解决TDS流协议错误问题
Laravel 7.30 开启SQL Server MARS配置方案
在config/database.php的sqlsrv连接配置中新增options参数,传入PDO_SQLSRV扩展的MARS启用属性即可,修改后的完整配置如下:
'sqlsrv' => [ 'driver' => 'sqlsrv', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', 'localhost'), 'port' => env('DB_PORT', '1433'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, 'appname' => env('DB_APPNAME', 'MyAppName-' . env('APP_ENV')), // 启用MARS配置 'options' => [ PDO::SQLSRV_ATTR_MARS_ENABLED => true, ], ],
配置注意事项
- 若你的
pdo_sqlsrv扩展版本低于5.8.0,未定义PDO::SQLSRV_ATTR_MARS_ENABLED常量,可直接替换为常量对应的整数值:'options' => [ 1092 => true, ], - 修改配置后需清空配置缓存生效:
php artisan config:clear
"Protocol error in TDS stream"错误其他可能诱因
- SQL Server服务器端主动关闭了MARS功能,可联系运维确认服务器配置
- 单次查询返回结果集过大,内存不足导致TDS数据包解析失败,可拆分大查询为分页查询
- 数据库长连接超时被服务器断开,复用无效连接发起查询触发报错,可新增PDO断线重连配置
pdo_sqlsrv扩展版本与SQL Server服务器版本兼容性不足,可升级扩展到最新稳定版
内容的提问来源于stack exchange,提问作者Jens Eeckhout
相关产品推荐
相关产品推荐

