最近購買了 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。