php 使用 redis 作为 session 管理,本文采用 unix 的 sock 方式连接,主要讲解编译 phpredis 、配置 php 和 redis 的关联
1 、简介
如果你想做 php 多服务器的会话保持,那么 redis 是一种选择之一。当然 memcache 也不错不过为了稳定,慢一点无所谓了。
本教程讲解 phpredis 编译,挂载,与配置文件修改。
2 、准备
1 、 phpredis 包 [链接]
2 、 PHP 的搭建方法,包含了一些本站的配置
1 、 php 成品环境
2 、 redis 安装完毕 (可通过 yum 安装)
3 、使用 root 用户
3 、操作
3.1 、快速安装
使用 pecl 可以快速安装 php-redis 并不需要自行编译,等价下面两个步骤的合集
#Redhat yum install php-pecl-redis
#Ubuntu apt install php7.2-redis
3.2 、编译 phpredis
首先我们需要生成 php 的当前配置信息
phpize
然后我们使用编译命令编译。参数里就是配置文件的位置(请自行替换为你的配置文件)
./configure --with-php-config=/usr/local/php7.2/bin/php-config
错误结果如下
configure: error: Cannot find php-config. Please use --with-php-config=PATH
正确结果如下
creating libtool
appending configuration tag "CXX" to libtool
configure: creating ./config.status
config.status: creating config.h
配置完毕后,我们开始编译 (2~10s)
make
便宜完毕了当然是安装
make install
返回的结果如下
Installing shared extensions: /usr/local/php7.4/lib/php/extensions/no-debug-non-zts-20170718/
实际上是生成了一个文件 redis.so 放在这个目录下了。
3.3 、修改 PHP 配置使用 redis 作为 session 管理
首先我们需要把这个文件添加进 php.ini 中
extension=redis.so
接着我们修改 redis 配置文件 /etc/redis.conf
#port 6379 port 0 #禁用端口访问 unixsocket /tmp/redis.sock unixsocketperm 660 #限制访问权限 # maxmemory <bytes> maxmemory 512mb #限制最高内存
然后我们修改 php 的配置 /usr/local/php7.2/etc/php-fpm.d/www.conf
php_value[session.save_handler] = redis php_value[session.save_path] = "unix:/var/run/redis.sock"
最后我们将 nginx 加入到 redis 用户组中
usermod -G redis nginx
如果不小心加错了可以删除(将 user 从 errorgroup 组中删除)
gpasswd -d user errorgroup
4 、其他
默认编译 PHP 时,不会自带 redis 的相关组件。
而 redis 作为数据库,速度比 php_session 文件加载就不知道快到哪去了。
4.1 、 Ubuntu 跨版本安装 php-redis
首先 Ubuntu 需要安装对应版本的 php*-dev 包以获取 phpize
apt install php7.4-dev
安装完毕后,默认的 php-redis 安装命令如下
pecl install redis
此时如果主机是多版本的 PHP 会发现一个问题
1 、如果旧 PHP 安装过,会被卸载,然后安装给新 PHP
2 、编译 PHP 只对应最后安装的 phpize
所以我们需要增加参数,额外指定需要在哪个版本中安装(调用指定的 phpize*)
pecl -d php_suffix=7.4 install redis
但是只是增加版本参数,并不能解决第一个的卸载问题
所以在安装完后,我们额外输入卸载命令进行虚假卸载,参数 -r 代表删除安装记录,忽略文件
pecl uninstall -r redis
pecl uninstall [options] [channel/]<package> ... Uninstalls one or more PEAR packages. More than one package may be specified at once. Prefix with channel name to uninstall from a channel not in your default channel (pecl.php.net) Options: -r, --register-only do not remove files, only register the packages as not installed
此时我们就可以输入多次这样的命令,让 php-redis 在多个版本中共存
pecl -d php_suffix=7.4 install redis pecl uninstall -r redis pecl -d php_suffix=8.1 install redis pecl uninstall -r redis
******** php v7.4 Build process completed successfully Installing '/usr/lib/php/20190902/redis.so' install ok: channel://pecl.php.net/redis-5.3.7 configuration option "php_ini" is not set to php.ini location You should add "extension=redis.so" to php.ini
******** php v8.1 Build process completed successfully Installing '/usr/lib/php/20210902/redis.so' install ok: channel://pecl.php.net/redis-5.3.7 configuration option "php_ini" is not set to php.ini location You should add "extension=redis.so" to php.ini
5 、后期修订
20220712:Ubuntu 跨版本安装 php-redis
6 、相关链接
1 、 phpredis 包 [链接]