Mac Sonoma M1环境下Laravel 11连接Azure SQL Server Edge失败求助
问题背景
在搭载M1芯片的Mac OS Sonoma 14.5系统中,通过Docker部署Microsoft Azure SQL Server Edge,已通过终端命令mssql -u SA -p MyPassword和Azure Data Studio成功连接数据库;PHP 8.2.0已安装SQLSRV与PDO_SQLSRV扩展,但配置Laravel 11的.env后,执行php artisan db:show或php artisan migrate出现连接错误。
.env配置:
DB_CONNECTION=sqlsrv DB_HOST=localhost DB_PORT=1433 DB_DATABASE=MyDatabase DB_USERNAME=SA DB_PASSWORD=MyPassword
环境信息:
- PHP 8.2.0
- Mamp Pro 6.8
- Microsoft Azure SQL Server EDGE
- Microsoft Azure Data Studio 1.48.0
- Docker 4.30.0
- Laravel 11.0.8
- Docker容器ID:afb6f21ec9ac
排查步骤
1. 确认Docker端口映射是否正确
检查Azure SQL Edge容器的端口映射状态,确保宿主机1433端口已映射到容器的1433端口:
执行命令:
docker port afb6f21ec9ac
若输出未显示0.0.0.0:1433->1433/tcp或[::]:1433->1433/tcp,说明端口映射未配置,需重新启动容器并添加映射:
docker stop afb6f21ec9ac docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=MyPassword" -p 1433:1433 --name sql-edge -d mcr.microsoft.com/azure-sql-edge
2. 替换DB_HOST为Docker容器IP
M1 Mac的Docker网络可能存在localhost解析异常,尝试直接使用容器IP替代localhost:
先获取容器IP:
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' afb6f21ec9ac
将.env中的DB_HOST替换为获取到的IP(例如172.17.0.2),然后清除Laravel配置缓存:
php artisan config:clear
再执行php artisan db:show测试连接。
3. 验证PHP扩展是否生效
在Laravel项目根目录创建测试文件test-sqlsrv.php,内容如下:
<?php phpinfo(); ?>
通过浏览器访问该文件,搜索sqlsrv和pdo_sqlsrv,确认扩展已加载。
或直接在终端执行:
php -m | grep sqlsrv php -m | grep pdo_sqlsrv
若未显示这两个扩展,需检查MAMP Pro的PHP扩展配置,确保php.ini中已添加:
extension=sqlsrv.so extension=pdo_sqlsrv.so
并确认扩展文件路径正确。
4. 检查目标数据库是否存在
通过Azure Data Studio连接数据库,确认MyDatabase已创建。若不存在,先手动创建该数据库,再执行迁移命令。
5. 验证SA账号权限
确保SA账号拥有足够的操作权限,可在Azure Data Studio中执行:
USE master; GRANT CONTROL SERVER TO [SA];
完成后重新测试Laravel连接。
6. 检查Laravel SQLSRV驱动配置
打开config/database.php,确认sqlsrv连接配置无异常:
'sqlsrv' => [ 'driver' => 'sqlsrv', '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, ],
确保没有额外配置项干扰连接逻辑。
内容的提问来源于stack exchange,提问作者bungdito

