Docker容器中PHP无法对接SQL Server,报sqlsrv_connect未定义错误
问题原因
你遇到的核心问题有两个:
- 未指定
sqlsrv/pdo_sqlsrv扩展版本:最新版的sqlsrv扩展已不再支持PHP7.3,pecl默认安装的高版本扩展和你的PHP版本不兼容,编译后无法被PHP正常加载,所以phpinfo中看不到扩展信息,调用相关函数时报未定义错误。 - 微软源与系统版本不匹配:你使用的
php:7.3-apache基础镜像基于Debian系统,你配置的是Ubuntu 20.04的微软软件源,安装的ODBC驱动和系统不兼容。
解决步骤
- 替换微软软件源为对应Debian版本的地址
php:7.3-apache对应Debian 10(Buster)版本,将原来添加Ubuntu源的两行替换为Debian 10的源配置:
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - RUN curl https://packages.microsoft.com/config/debian/10/prod.list > /etc/apt/sources.list.d/mssql-release.list
- 指定兼容PHP7.3的sqlsrv扩展版本安装
将原来的pecl安装命令修改为指定5.9.0版本(该版本是最后一个支持PHP7.3的sqlsrv稳定版本):
RUN pecl install sqlsrv-5.9.0 pdo_sqlsrv-5.9.0 RUN docker-php-ext-enable sqlsrv pdo_sqlsrv
- 清理旧镜像缓存,重新构建
执行以下命令避免旧缓存影响:
docker-compose down -v docker-compose build --no-cache docker-compose up -d
- 验证扩展是否正常加载
容器启动后执行以下命令,如果输出sqlsrv和pdo_sqlsrv则说明扩展安装成功:
docker exec app-cp-v3 php -m | grep sqlsrv
可选优化
你可以在Dockerfile中扩展安装步骤后添加验证命令,构建时就能提前发现扩展加载问题:
RUN docker-php-ext-enable sqlsrv pdo_sqlsrv && php -m | grep sqlsrv
内容的提问来源于stack exchange,提问作者Brand
相关产品推荐
相关产品推荐

