Ubuntu22.04+PHP8.1环境PDO_SQLSRV驱动找不到问题求助
你的核心问题是CLI模式下PHP能加载pdo_sqlsrv,但Apache运行的PHP无法加载该驱动,结合你的操作步骤,以下是关键问题和解决方法:
1. 驱动文件名版本不匹配
你在步骤2中新建的30-pdo-sqlsrv文件里写的是extension=php_pdo_sqlsrv_82_nts.so,但你使用的是PHP8.1,下载的也是Ubuntu2204-8.1的驱动包,正确的驱动文件名应该是php_pdo_sqlsrv_81_nts.so(带81而非82)。这个错误会导致Apache无法找到对应的驱动文件,自然无法加载。
修正方法:
编辑/etc/php/8.1/apache2/conf.d/30-pdo-sqlsrv,将内容改为:
extension=php_pdo_sqlsrv_81_nts.so
2. 统一Apache的PHP扩展配置方式
你同时在php.ini和conf.d目录下的文件中配置扩展,容易出现冲突或加载顺序问题。建议将所有sqlsrv相关的扩展配置统一放到conf.d目录下:
- 新建
20-sqlsrv.ini文件在/etc/php/8.1/apache2/conf.d/,写入:extension=php_sqlsrv_81_nts.so - 删除
/etc/php/8.1/apache2/php.ini中你添加的extension=php_sqlsrv_81_nts.so这一行。
这样配置更符合Ubuntu下PHP的扩展管理规范,避免加载顺序问题。
3. 检查驱动文件权限
确保复制到/usr/lib/php/20210902的驱动文件权限正确,Apache的运行用户(通常是www-data)需要有读取权限:
执行命令修改权限:
sudo chmod 644 /usr/lib/php/20210902/php_sqlsrv_81_nts.so sudo chmod 644 /usr/lib/php/20210902/php_pdo_sqlsrv_81_nts.so sudo chown root:root /usr/lib/php/20210902/php_sqlsrv_81_nts.so sudo chown root:root /usr/lib/php/20210902/php_pdo_sqlsrv_81_nts.so
4. 验证ODBC依赖是否安装
Microsoft SQL Server PHP驱动依赖ODBC驱动,你需要确保已经安装了正确版本的ODBC驱动(msodbcsql17或msodbcsql18):
执行以下命令检查:
dpkg -l | grep msodbcsql
如果没有输出,说明未安装,可执行以下命令安装(以msodbcsql18为例):
sudo curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - sudo curl https://packages.microsoft.com/config/ubuntu/22.04/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list sudo apt update sudo ACCEPT_EULA=Y apt install -y msodbcsql18
5. 重启Apache并验证
完成以上修改后,重启Apache:
sudo service apache2 restart
然后重新查看phpinfo页面,检查是否出现pdo_sqlsrv的相关模块信息,再运行你的测试代码验证连接。
内容的提问来源于stack exchange,提问作者LMORSE

