php连接sqlsrv流程记录

李安歌
2023-12-01

1。本机是 mac m1 没有按照微软官方php连接方式下载扩展工具。开发一直使用的alpine3.13-php-fpm7.4 自建docker容器进行开发。使用yii框架,连接sqlsrv 2008r2。
按照微软官网文档安装pdo_sqlsrv5.9 sqlsrv odbc 支持 最终问题都会卡在容器上面,首先自建环境的 核心类库 以及 pecl 这些 gcc c++这些都需要自己安装,最终出现 扩展依赖 not found 但是依赖文件确实存在 lld .so依赖文件 只能看到 not sported type xx 之类的错误。无果之后考虑更换镜像不再使用alpine。
2。 后续找到 namoshek/php-mssql 镜像 这是基于官方php镜像生成的镜像(PHP 7.4(基于 Debian Buster)+ Microsoft ODBC 驱动程序 17 + sqlsrv + pdo_sqlsrv(FPM 和 CLI))。它是单独的php 镜像 并且支持了sqlsrv 没有支持mysql 需要自己启用容器 并通过官方指令 docker-php-ext-install 。 安装mysql一系列扩展。安装完毕后运行项目会提示ssl SSL routines:ssl_choose_client_version:unsupported protocol 错误,修改/etc/ssl/openssl.cnf 文件 将 MinProtocol = TLSv1.2 改为 1 即可 这是因为高版本系统使用了较高的ssl 协议连接低版本的sqlsrv服务时协议不一致导致的,通过降级ssl协议即可解决。

3。 通过docker-compose 拉起两个容器 一个nginx 一个上述php-fpm74 容器 将项目映射可以实现同时连接两个数据库。使用没有问题。
4。 测试服务器没有docker,本身是centos7.5 内核 需要自己扩展 pdo_sqlsrv\sqlsrv\odbc 。根据网上教程 yum 更新 添加微软yum源 后 yum 安装msodbcsql mssql-tools unixODBC-devel ,然后到pecl 官网找到https://pecl.php.net/package/sqlsrv 以及pdo_sqlsrv 扩展包 wget 后 自编译安装,然后在php.ini 文件添加 extension= 扩展名即可, 重启php-fpm 查看 phpinfo 即可看到 pdo_sqlsrv 和 sqlsrv 然后进行使用时发现 报Segmentation fault (core dumped) 内核错误 通过 ulimit -a 设置内存文件输出 安装gdb 排查追踪发现问题原因如果,排查php-fpm日志 发现 提示 swoole_tracker.so 文件报错。怀疑是有冲突,将swoole_tracker 扩展去除后,项目运行正常。

 类似资料: