基于Apache(Windows 10、CentOS 6.5)、Redis(CentOS 6.5)的用户session会话的分布式实现流程

1、前提,Windows 8.1下Redis的安装,且配置支持php的实现流程:http://www.shuijingwanwq.com/2015/11/16/769/

设置Redis服务器允许通过哪些IP进行访问及密码,如图1、2:

bind 127.0.0.1 192.168.2.30

requirepass n#S7yLE$R5s&Mmp#W9K9*HjZApTU%hpQ

命令:service redis restart,重启Redis服务;

设置Redis服务器允许通过哪些IP进行访问

 

设置Redis服务器访问密码

2、设置web服务器的php.ini,如图3:

; session.save_handler = files
session.save_handler = redis

; session.save_path = “/tmp”
; session.save_path = “D:/phpsessiontmp”
session.save_path = “tcp://192.168.2.30:6379?auth=n#S7yLE$R5s&Mmp#W9K9*HjZApTU%hpQ”
高强度的散列函数可以产生高强度的会话 ID。 虽然即使是使用 MD5 散列算法,要找到相同的散列值也是非常不易的, 但是开发人员还是应该选择 SHA-2 或者更高的散列算法, 例如可以使用 sha384 或者 sha512。
; session.hash_function = 0
session.hash_function = “sha512″

重启Apache服务;
生成:PHPSESSID:”llg6i9ddv0m012ajrhki8nn675q42an11k87sjaqd8lj53bnelb32v4gvkh7fn3pelp9eec8os1tk430aqp45tj1uisg6sgfk0qeer2”

设置web服务器的php.ini

3、编辑phpRedisAdmin配置文件,且正常运行,如图4、5:

$config = array(
‘servers’ => array(
array(
‘name’ => ‘local server’, // Optional name.
‘host’ => ‘192.168.2.30’,
‘port’ => 6379,
‘filter’ => ‘*’,

// Optional Redis authentication.
‘auth’ => ‘n#S7yLE$R5s&Mmp#W9K9*HjZApTU%hpQ’ // Warning: The password is sent in plain-text to the Redis server.
),

编辑phpRedisAdmin配置文件,且正常运行

 

编辑phpRedisAdmin配置文件,且正常运行

4、编写测试程序,如图6:

<?php
//header(“Content-type: text/html; charset=utf-8”);
session_start();
$_SESSION[‘count’] = 1;
echo $_SESSION[‘count’];
?>

编写测试程序

5、测试报错,如图7:
Fatal error: Uncaught exception ‘RedisException’ with message ‘Failed to AUTH connection’ in E:\wwwroot\phpinfo.php:4 Stack trace: #0 E:\wwwroot\phpinfo.php(4): session_start() #1 {main} thrown in E:\wwwroot\phpinfo.php on line 4

Fatal error: Uncaught exception ‘RedisException’ with message ‘Failed to AUTH connection’ in [no active file]:0 Stack trace: #0 {main} thrown in [no active file] on line 0

5、测试报错,如图7:
Fatal error: Uncaught exception ‘RedisException’ with message ‘Failed to AUTH connection’ in E:\wwwroot\phpinfo.php:4 Stack trace: #0 E:\wwwroot\phpinfo.php(4): session_start() #1 {main} thrown in E:\wwwroot\phpinfo.php on line 4
Fatal error: Uncaught exception ‘RedisException’ with message ‘Failed to AUTH connection’ in [no active file]:0 Stack trace: #0 {main} thrown in [no active file] on line 0

6、解决方案,重新修改密码,且其中不能够包含特殊字符,只允许数字与字母,得以解决,测试程序运行正常,如图8:

解决方案,重新修改密码,且其中不能够包含特殊字符,只允许数字与字母,得以解决,测试程序运行正常

7、然后在web服务器操作系统为CentOS上也准备实现session存放于Redis中,执行命令,如图9:
php -m

php -m

查看是否已经安装php-redis扩展(或者可以查看phpinfo(),如图10),如果没有,则执行命令,如图11:
yum install php-redis

查看phpinfo()

安装php-redis扩展

8、设置web服务器的php.ini,如图12、13:

; session.save_handler = files
session.save_handler = redis

; session.hash_function = 0
session.hash_function = “sha512”

重启Apache服务;

session.save_handler = redis

session.hash_function = “sha512”

9、编辑/etc/httpd/conf.d/php.conf,如图14

# php_value session.save_handler “files”
# php_value session.save_path “/var/lib/php/session”
php_value session.save_handler “redis”
php_value session.save_path “tcp://192.168.2.30:6379?auth=2LMDCDh7CfWhJGC9bAuercMEZYULs25y”

重启Apache服务;

编辑/etc/httpd/conf.d/php.conf

10、此时基于CentOS上的web服务器用户登录已经可以正常运行,只是PHPSESSID仍然为md5加密的,而并非sha512,原因在于在浏览器端还存在cookie:PHPSESSID,如图15、16

浏览器端还存在cookie:PHPSESSID

Redis中已经生成对应的PHPSESSID

11、如果浏览器端不存在名为PHPSESSID的cookie的话,则PHPSESSID则为sha512加密的,如图17

如果浏览器端不存在名为PHPSESSID的cookie的话,则PHPSESSID则为sha512加密的

永夜