前言
近期在做老系统迁移, 发现一堆老古董,centos6 + php-5.4.39 还有一堆pho的扩展, 注定过程不会简单。前提没办法升级, 只能做维护性迁移至容器。
问题:
遇到问题, php不能发现mysql库
报错:
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/mysqli.so' - /usr/lib64/mysql/libmysqlclient.so.18: symbol X509_check_ip_asc, version libcrypto.so.10 not defined in file libcrypto.so.10 with link time reference in Unknown on line 0
查看模块,没有发现mysql库加载:
查看mysql可以已经被安装:
尝试解决,未解决:
只能查报错的原因,网上给出的答案,比较多的是指向openssl版本低不兼容。查看openssl版本, 大版本相同, 小版本比原系统高, 已经无法降级至原来的版本, 只能手动编译openssl。(未解决问题, 可以不看)
参照:
openssl-1.0.1e 下载地址
https://www.openssl.org/source/old/1.0.1/openssl-1.0.1e.tar.gz
wget https://www.openssl.org/source/old/1.0.1/openssl-1.0.1e.tar.gz
#载完毕后解压,注意编译安装openssl需要c
#执行:
yum install -y gcc gcc-c++
./config shared zlib-dynamic
make -j4 && make install
生成
libssl.so.1.0.0
libcrypto.so.1.0.0
将两个文件拷贝到 /usr/lib64
创建软链接(ln源就是上面查出的对应版本的库文件):
cd /usr/lib64/
ln -s libssl.so.1.0.0 libssl.so.10
ln -s libcrypto.so.1.0.0 libcrypto.so.10
然后再次验证。 php -m | grep mysql仍然未发现库 -。- 个人直觉,openssl小版本不至于会导致库加载失败, 应该是其他的问题导致的。
再次尝试解决,暴力解决:
打不过怎么办, 就去加入呗
先验证下是lib库的问题导致这个问题出现的。
道理很简单,把整个lib64库拿过去,然后重新加载,看问题是否解决:
# 使用rsync同步,简单高效
#rsync添加如下配置
[test]
uid=root
gid=root
path = /usr/lib64
read only = yes
#另一端同步下
rsync -va xxxx::test /usr/lib64/
#然后重新加载库文件:
ldconfig
再次检查,发现能够识别mysql库, 大功告成,理论上解决问题;
定位解决问题:
理论上 上面已经解决问题了, 但是不甘心,就是欠
第一》 真实原因不知道是为什么
第二》可以将整个lib目录同步过来, 但是放在容器里面有点大,违背容器轻量化的初衷
那就继续暴力查找:
既然是库的问题导致的, 找到库是哪个就行了。这玩意简单,弄个for循环自己跑呗:
#脚本大概有这么几个部分:
#获取同步的列表,用作循环
#进入循环,打印当前模块名
#同步模块目录,然后判断mysql库文件是否加载
#如果加载成功,打印
for i in $(rsync -a xxxx::test |awk '$NF!~/\./{print $NF}') ;do echo "###"$i; rsync -a xxxx::test/$i /usr/lib64 ;php -m | grep mysql && echo "Success at:"$i ;done
如愿以偿找到这个mysql库的问题。然后在分析, 是哪个包安装的, 差异是什么
#容器内:
rpm -qf /usr/lib64/mysql/libmysqlclient.so.18.1.0
mysql-community-libs-compat-5.7.28-1.el7.x86_64
#物理机:
rpm -qf /usr/lib64/mysql/libmysqlclient.so.18.0.0
mysql-libs-5.5.27-1.el6.x86_64
看起开比较明显了,这个mysql-libs 安装的不同。
至于原因:我重新安装了一下mysql-libs,输出如下:
mysql-libs版本也进行了升级,老版本的rpm包已经被替换了。
最后问题解决办法, 自然是没办法安装mysql-libs这个库, 只能是把旧的mysql-libs安装的库文件 add进入容器内, 完美解决。