在IIS7中配置PHP7.2连接SQL Server的PDO问题求助
我之前帮朋友排查过几乎一模一样的问题,给你列几个一步步走的排查点,应该能定位到问题:
确认DLL版本完全匹配:PHP7.2的SQL Server扩展分线程安全(TS)和非线程安全(NTS),还要对应x86/x64架构,这一点错了绝对加载不了。你可以先看phpinfo里的
Thread Safety项——显示enabled就是TS版,否则是NTS;再看Architecture项确认是x86还是x64。然后检查你放的DLL文件名,比如TS x64的PHP7.2对应的PDO扩展应该是php_pdo_sqlsrv_72_ts_x64.dll,必须和你的PHP环境完全对应。验证php.ini修改的准确性:
- 首先确认你修改的是IIS实际使用的php.ini:打开phpinfo页面,找到
Loaded Configuration File项,复制路径,去修改这个文件,别改错了CLI版的ini。 - 然后检查扩展启用语句,比如如果DLL全名是
php_pdo_sqlsrv_72_ts_x64.dll,那ini里要写extension=php_pdo_sqlsrv_72_ts_x64.dll,别只写extension=php_pdo_sqlsrv.dll(有些环境可能兼容,但保险起见用全名)。 - 还要确认
extension_dir配置的路径正确,比如extension_dir = "C:\PHP\ext"(换成你实际的扩展目录),路径不能写错,而且这个目录要有IIS进程的读取权限。
- 首先确认你修改的是IIS实际使用的php.ini:打开phpinfo页面,找到
必须重启整个IIS服务:修改php.ini后别只刷新网页,一定要彻底重启IIS。最简单的方法是打开命令提示符,运行
iisreset命令,或者在IIS管理器里重启对应的应用程序池和网站——有时候只重启网站不够,必须重置整个IIS服务才能让新的php.ini生效。检查ODBC驱动依赖:SQL Server的PHP扩展依赖Microsoft ODBC Driver for SQL Server,PHP7.2需要的是13.1版本及以上(推荐17版),而且驱动架构要和PHP一致(x86/x64)。你可以去控制面板的「程序和功能」里看看有没有安装对应的驱动,如果没有就装一个——这是很多人忽略的点,没装ODBC驱动的话,哪怕DLL放对了也加载失败。
查看PHP错误日志找线索:如果上面几步都没解决,就打开php.ini里的
error_log配置,设置一个日志路径(比如error_log = "C:\PHP\logs\php_errors.log"),然后重启IIS,访问phpinfo页面,之后去日志文件里找关于pdo_sqlsrv的错误信息。比如日志里如果出现「Unable to load dynamic library 'php_pdo_sqlsrv.dll' - 找不到指定的模块」,那大概率是ODBC驱动没装或者DLL版本不对。检查IIS应用程序池架构:打开IIS管理器,找到你的网站对应的应用程序池,右键选「高级设置」,看「启用32位应用程序」选项——如果你的PHP是x64版,这里要设为
False;如果是x86版,就设为True。架构不匹配的话,扩展也无法正常加载。
内容的提问来源于stack exchange,提问作者Aldrich Hipolito

