在我的虚拟机里面, 与前端同学进行接口联调, 完成后发版到测试环境时, 前端同学突然说这个不对劲, 以为啥不对呢, 原来说的是返回值类型不对.
不慌不忙, 去测试环境抓包看了下, 接口返回有 int 有 string, 再看我的虚拟机服务返回的全是 string.
经过调试发现, 数据库查询结果在虚拟机为 stirng, 在测试环境则为 int. 应该是我虚拟机环境出了什么问题.
首先我的虚拟机直连的测试库, 排除掉数据库服务端配置问题.
视线转移到客户端配置: PDO::ATTR_STRINGIFY_FETCHES 表示提取的时候将数值转换为字符串
这个参数是可以影响到返回值的, 但是配置项经过跟测试环境比对, 底层设置默认都是 false, pass掉这个点.
那么什么原因呢? 比对php版本、拓展包后, 拓展包发现测试环境比我的虚拟机里面多了一个 mysqlnd 的东西.
为了验证是否和这个有关系, 首先卸载了默认的 mysql 拓展包, 安装上了 mysqlnd
# libmysql mysql官方开发
yum remove php71w-mysql
yum install -y php71w-mysqlnd
重启php-fpm
请求发现类型这次对了
这三个到底什么关系, 为什么移除旧 mysql 安装上 mysqlnd 类型就不会转换了呢?
原来虚拟机使用的是 libmysql, 而测试环境使用的是 mysqlnd 连接的数据库, 当初安装使用的网上教程, 产生了不一致的问题.
pdo_mysql 驱动实现了 pdo的接口, 底层使用了mysqlnd或libmysql与mysql通讯.
使用mysqlnd, 需要使用以下命令编译安装:
编译php时,修改以下几个项参数即可
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd
mysqldnd即mysql native driver简写,即是由PHP源码提供的mysql驱动连接代码.它的目的是代替旧的 libmysql(MySQL官方提供的)驱动.
简单来说, mysqlnd 提供了底层与myslq网络交互的能力, 而 pdo_mysql 则属于上层的协议, 是我们代码中可以直接使用的方法(query).
与使用MySQL客户端库相比,使用MySQL本机驱动程序具有许多优势。
较早的MySQL客户端库由MySQL AB(现为Oracle Corporation)编写,因此是在MySQL许可下发行的。这最终导致MySQL默认情况下在PHP中禁用MySQL支持。但是,MySQL本机驱动程序是作为PHP项目的一部分开发的,因此是在PHP许可下发布的。这样可以消除过去一直存在问题的许可问题。
同样,在过去,您需要针对MySQL客户端库的副本构建MySQL数据库扩展。这通常意味着您需要在用于构建PHP源代码的计算机上安装MySQL。另外,当您的PHP应用程序运行时,MySQL数据库扩展将在运行时调用MySQL客户端库文件,因此需要在系统上安装该文件。使用MySQL Native Driver不再是这种情况,因为它已包含在标准发行版中。因此,您不需要安装MySQL即可构建PHP或运行PHP数据库应用程序。
由于MySQL本机驱动程序是作为PHP扩展编写的,因此它与PHP的工作紧密相关。由于驱动程序使用PHP内存管理系统,因此可以提高效率,尤其是在内存使用方面。它还支持PHP内存限制。与使用MySQL客户端库相比,使用MySQL本机驱动程序可获得可比的性能或更好的性能,它始终确保最有效地使用内存。内存效率的一个例子是,当使用MySQL客户端库时,每行在内存中存储两次,而对于MySQL Native Driver,每行仅在内存中存储一次。