当前位置:首页 > 问答 > 正文

Linux下用yum装redis.so扩展库,过程和坑点分享

这个事儿是这样的,我之前在搞一个PHP项目,本地开发环境用的是Windows,上面装了个叫phpredis的扩展,用得好好的,但是项目最后要放到一台Linux服务器上跑,那台服务器用的是CentOS系统,管理软件包的工具叫yum,我就想着,那在服务器上肯定也得装上这个redis扩展才行啊,不然程序连不上Redis缓存,我以为就是一行yum命令的事儿,结果没想到里面有好几个坑,折腾了我大半天。

第一步:想当然的尝试,直接yum install

我最开始的想法特别简单,觉得既然yum这么好用,那直接搜一下装上不就完了,我就在服务器的黑窗口(也就是终端)里输入了 yum search redis,想看看有没有现成的包,结果一搜,出来一大堆东西,有redis服务器本身的软件包,名字就叫redis,还有一些名字里带phpredis的包,比如php-pecl-redis

我当时可高兴了,觉得这不就是我要的吗?pecl好像是PHP扩展社区库的意思,那php-pecl-redis肯定就是正主了,于是我二话不说,直接输入了 yum install php-pecl-redis,安装过程挺顺利的,yum提示要安装一些依赖包,我都同意,装完之后,我兴冲冲地重启了PHP的服务(一般是php-fpm)和Web服务器(我用的Nginx),然后写了个简单的PHP脚本 phpinfo() 来查看扩展有没有被加载。

结果一盆冷水泼下来,我在页面上死活找不到redis这个模块,我当时就纳闷了,明明显示安装成功了,为啥没效果呢?

第一个坑点:PHP版本对不上(来源:根据常见Linux发行版仓库滞后性总结)

这就是我遇到的第一个大坑,我仔细检查了一下yum的安装记录,又用 yum list installed | grep redis 看了看确实装上了,然后我突然意识到一个问题:yum仓库里的软件包版本,往往不是最新的,我赶紧用 php -v 看了一下服务器上PHP的版本,是7.4,而我本地开发用的是PHP 8.0,我怀疑是不是这个php-pecl-redis的包太老了,只支持老版本的PHP,跟我服务器上的PHP 7.4不兼容?或者说,yum仓库里的这个扩展包,压根就是给另一个版本的PHP准备的?

第二步:寻找更靠谱的方法,用PECL直接装

既然yum仓库里的版本可能有问题,那我就得找一个更新的来源,这时候我就想到了PECL本身,PECL是PHP扩展的官方仓库,上面的版本肯定是最新的,服务器上一般会自带一个叫pecl的命令行工具。

我马上尝试了一下,直接输入 pecl install redis,这个命令会直接去PECL官网下载最新的redis扩展源代码,然后在本地编译安装,我以为这下总该没问题了吧?

第二个坑点:缺少编译环境(来源:常见编译安装依赖问题)

结果命令一运行,没几下就报错了,提示找不到phpize命令,还有什么C编译器错误,这又是为啥呢?原来,pecl install这种方式是需要编译源代码的,编译就需要一套编译工具,而我的服务器是最小化安装的,可能为了省资源,压根就没装这些编译需要的软件包。

没办法,只能先解决依赖问题,我再用yum来安装编译环境,需要的包大概有这些: yum install php-devel (这个非常重要,它提供了phpize命令,用来准备PHP扩展的编译环境) yum install gcc gcc-c++ make (这些是基础的C/C++编译器) 可能还需要一些其他的,比如autoconf之类的,如果报错缺啥再装啥就行。

我把这些包装上之后,再重新运行 pecl install redis,这回终于看到编译过程了,一大堆代码在屏幕上滚动,最后提示安装成功,它还友好地提醒我,需要在php.ini配置文件里加上一句 extension=redis.so

第三步:配置PHP并验证

我高兴坏了,赶紧找到php.ini文件(它的位置可以通过 php --ini 命令查看),在文件末尾加上了extension=redis.so,然后再次重启php-fpm和nginx。

怀着激动的心情,我再次打开那个phpinfo()页面,用浏览器搜索“redis”,哈哈!这次终于看到了redis扩展的详细信息,版本号还挺新!

第三个坑点:SELinux可能捣乱(来源:Linux安全模块常见权限问题)

本来以为大功告成了,我写了个测试脚本连接Redis,结果居然报错了,提示连接被拒绝或者权限不足,我检查了Redis服务器的配置,防火墙端口也开了,就是连不上,我想到服务器可能开启了SELinux(一个安全模块),我临时把它设置为宽容模式试试看,命令是 setenforce 0,设置完之后,再测试,连接成功了!这说明问题出在SELinux的策略上,永久解决的话,需要配置正确的SELinux策略,或者如果环境允许,可以禁用它(但这不是最佳安全实践)。

总结一下过程和主要坑点:

  1. 过程:

    • 先别急着装,用 php -v 看清楚你的PHP版本。
    • 可以优先尝试 yum install php-pecl-redis,但如果版本老旧导致失败,就别纠结。
    • 更可靠的方法是安装编译环境(php-devel, gcc等),然后用 pecl install redis 直接安装最新版。
    • 安装后,记得在php.ini中加上 extension=redis.so,并重启PHP服务。
    • 最后一定要写个脚本测试功能是否正常。
  2. 主要坑点:

    • yum仓库版本滞后。 仓库里的扩展包可能不是最新的,与你当前的PHP版本不兼容。
    • 缺少编译环境。 用PECL源码安装需要php-develgcc等工具,最小化安装的系统可能没有。
    • SELinux安全限制。 即使扩展装好了,SELinux可能会阻止PHP进程连接网络(如Redis端口),导致连接失败。

这就是我那次安装redis.so扩展的全部经历和踩过的坑,希望对你有所帮助,能让你少走点弯路。

Linux下用yum装redis.so扩展库,过程和坑点分享