最近购买了 Redis 云数据库,打算将 PHP Session 存放到 Redis。
安装
首先需要安装 PHPRedis 扩展,这里以 CentOS 为例:
1# yum install php-redis
1# pecl install redis
在 CentOS 中可以通过
yum install php-pear
安装 pecl 命令。
其他环境可以参考官方安装指南。
配置
紧接着进行 Redis 配置,其中主要配置为 session.save_handler 和 session.save_path:
1session.save_handler = redis
2session.save_path = "tcp://host:port?auth=password&database=0"
session.save_path 中 auth
为 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_handler 和 session.save_path 是否生效。测试后请记得删除,否则暴露敏感信息,比如 Redis 连接信息 – PHP 安全 – 不要暴露 phpinfo。
如果 php.ini 已经配置了 session.save_handler 和 session.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。