PHP 设置 Redis 存储 Session

本页内容

最近购买了 Redis 云数据库,打算将 PHP Session 存放到 Redis。

安装

首先需要安装 PHPRedis 扩展,这里以 CentOS 为例:

1# yum install php-redis
1# pecl install redis

在 CentOS 中可以通过 yum install php-pear 安装 pecl 命令。

其他环境可以参考官方安装指南

配置

紧接着进行 Redis 配置,其中主要配置为 session.save_handlersession.save_path

1session.save_handler = redis
2session.save_path = "tcp://host:port?auth=password&database=0"

session.save_pathauth 为 Redis 密码,database 为数据库,都是可选的。

测试

测试前,需要重启 PHP 服务,然后写个测试脚本:

1session_start();
2$count = $_SESSION['count'] ?? 0;
3$_SESSION['count'] = ++$count;
4echo $count;

另外开启 Redis 监控:

1$ redis-cli -h <host> -a <password> monitor
2OK

如果没有差错,可以看到页面数值随刷新次数递增,监控结果类似:

11578351808.114912 [0 172.18.124.156:40210] "GET" "PHPREDIS_SESSION:3aac30ca920c61b2cc21677e41b7dad3"
21578351808.116330 [0 172.18.124.156:40210] "SETEX" "PHPREDIS_SESSION:3aac30ca920c61b2cc21677e41b7dad3" "1440" "count|i:1;"

在 Redis 里面也可以看到相关 Session 的信息:

1$ redis-cli -h <host>
2> keys *
31) "PHPREDIS_SESSION:3aac30ca920c61b2cc21677e41b7dad3"

自此安装完成。

问题排查

如果出现问题,先利用 phpinfo 确保 session.save_handlersession.save_path 是否生效。测试后请记得删除,否则暴露敏感信息,比如 Redis 连接信息 – PHP 安全 – 不要暴露 phpinfo

如果 php.ini 已经配置了 session.save_handlersession.save_path,但是没有生效,有三个可能性高的原因:

  • 修改后没有保存和重启 PHP 服务。
  • 修改了错误的 php.ini,phpinfo 会打印其加载的 ini 文件,仔细检查即可。
  • PHP-FPM 的 www.conf 中覆盖了 php.ini 的配置,比如 php_value[session.save_handler] = files

如果配置正常,利用 redis-cli monitor 查看指令是否正常,笔者安装时就遇到 php 配置问题导致 Redis 无法保存 Session 的问题,详情可以参看 Issue