php 使用 redis 作为 session 管理

2018-03-22 2444点热度 0人点赞

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 包 [链接]

StarryVoid

Have a good time