MacOS下VSCode运行PHP报sqlsrv_connect未定义pdo_sqlsrv不存在
问题对应报错表现
运行PHP程序时抛出致命错误:Fatal error: Uncaught Error: Call to undefined function sqlsrv_connect(),phpinfo中无sqlsrv、pdo_sqlsrv扩展条目,VSCode Intelephense无法识别pdo_sqlsrv相关语法。
分步排查解决
第一步:确认pecl与当前运行的PHP版本匹配
Mac环境常出现多版本PHP共存的情况,pecl如果对应到其他PHP版本,安装的扩展不会被当前使用的PHP加载。
执行以下命令确认路径匹配:# 查看当前PHP路径 which php # 查看当前pecl路径 which pecl # 查看当前PHP版本、架构信息 php -v正常情况下pecl和php应当在同一级bin目录下,比如Homebrew安装的arm架构PHP,路径通常为
/opt/homebrew/bin/php,对应pecl路径为/opt/homebrew/bin/pecl。如果路径不匹配,先调整环境变量优先级,确保你正在使用的PHP对应的pecl被优先调用,再重新执行扩展安装命令。第二步:确认扩展配置已写入正确的php.ini
pecl安装扩展不会自动把扩展引入配置加到php.ini里,安装完成后需要手动添加:# 查看当前PHP加载的php.ini路径 php --ini打开命令输出中
Loaded Configuration File对应的ini文件,在文件末尾添加两行配置:extension=sqlsrv.so extension=pdo_sqlsrv.so保存后执行
php -m | grep sqlsrv验证,如果返回结果包含sqlsrv和pdo_sqlsrv,说明命令行环境下扩展已经加载成功。第三步:解决Web服务(PHP-FPM)环境扩展不加载问题
如果命令行下扩展加载正常,但浏览器访问phpinfo()看不到扩展,是因为PHP-FPM会加载独立的php.ini配置。执行以下命令找到FPM对应的ini路径:php-fpm -i | grep "Loaded Configuration File"同样在对应ini文件末尾加上上述两行扩展配置,之后重启PHP-FPM服务即可,Homebrew安装的PHP可直接执行对应版本的重启命令,例如PHP8.2版本执行:
brew services restart php@8.2第四步:解决VSCode Intelephense识别问题
之前仅添加sqlsrv存根无法识别pdo_sqlsrv,需要在「设置 >> intelephense >> Stubs」配置项中,同时添加sqlsrv和pdo_sqlsrv两个存根条目,添加完成后执行命令面板中的Intelephense: Restart Language Server重启语言服务,即可正常识别相关语法。
常见兼容性问题处理
- M系列芯片(arm64架构)的Mac设备,安装扩展前需要先通过Homebrew安装unixodbc依赖:
brew install unixodbc,否则会出现扩展编译失败、加载时动态库架构不兼容的问题。 - 不建议使用MacOS系统自带的PHP版本,该版本受系统权限限制,扩展安装后大概率无法正常加载,优先使用Homebrew安装的PHP版本。
- 如果加载扩展时提示找不到
.so文件,执行pecl config-get ext_dir查看PHP扩展存放目录,进入目录确认是否存在sqlsrv.so、pdo_sqlsrv.so两个文件,不存在则说明之前pecl安装过程有报错未完成,根据安装输出的错误提示补装依赖后重新安装即可。
内容的提问来源于stack exchange,提问作者Jayco

