You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker LAMP容器中PHP7.3的sqlsrv/pdo_sqlsrv扩展加载失败问题求助

解决Docker PHP7.3容器中sqlsrv扩展无法加载的问题

你的核心问题是扩展配置语句中的多余引号,导致PHP尝试加载带引号的文件名(比如"pdo_sqlsrv.so"而不是pdo_sqlsrv.so),同时手动复制php.ini可能覆盖了正确的扩展配置路径。以下是具体的修复方案:

1. 修复Dockerfile中的扩展配置逻辑

官方PHP镜像提供了docker-php-ext-enable工具,能自动处理扩展的配置文件生成,比手动写入ini文件更可靠。修改Dockerfile中安装SQL Server扩展的部分:

# Install MS ODBC Driver for SQL Server
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \
 && curl https://packages.microsoft.com/config/debian/9/prod.list > /etc/apt/sources.list.d/mssql-release.list \
 && apt-get update \
 && apt-get -y --no-install-recommends install msodbcsql17 unixodbc-dev \
 && pecl install sqlsrv pdo_sqlsrv \
 && docker-php-ext-enable sqlsrv pdo_sqlsrv \
 && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*

为什么这样改?

  • 去掉了原命令中多余的转义引号(比如\"extension=pdo_sqlsrv.so\"),原写法会让配置文件里的扩展名称带引号,PHP加载时会寻找不存在的"pdo_sqlsrv.so"文件
  • 使用docker-php-ext-enable自动生成正确的扩展配置,避免手动解析php.ini路径时出错

2. 处理自定义php.ini的冲突

如果你自己的php.ini中已经添加了extension=sqlsrv.soextension=pdo_sqlsrv.so,请删除这两行——因为docker-php-ext-enable已经自动生成了对应的配置文件,重复配置可能导致加载异常。

如果必须使用自定义php.ini,确保里面的扩展路径正确,或者直接依赖docker-php-ext-enable的配置,不要手动添加扩展加载语句。

3. 修复docker-compose.yml中的语法错误

你的docker-compose.yml里存在多余的引号,可能导致挂载或端口映射异常,修改以下部分:

# 原mysql volumes部分
volumes:
  - datafiles:/var/lib/mysql
  - "./scripts:/docker-entrypoint-initdb.d"  # 去掉外层的转义引号

# 原phpmyadmin ports部分
ports:
  - "8081:80"  # 去掉外层的转义引号

4. 清理缓存并重新构建

之前的构建缓存可能保留了错误的配置,执行以下命令彻底重建:

# 停止并删除现有容器
docker-compose down
# 清理镜像缓存
docker-compose build --no-cache website
# 重新启动容器
docker-compose up -d

5. 验证扩展是否加载成功

进入php容器执行命令验证:

docker exec -it php73 php -m | grep sqlsrv

如果输出pdo_sqlsrvsqlsrv,说明扩展加载成功。

内容的提问来源于stack exchange,提问作者rootKitty

火山引擎 最新活动