PHP+redis实现session共享功能

Session共享的应用场景应该是这样的, A主站下面有N个子站点, 比如:blog.a.com,person.a.com,要实现这种功能, 我无论在哪个上面登录, 我切换到其它站点的时候,都要保持一个登录的状态。

环境配置不用说了, 既然要做Redis共享, 就少不了一台Reids主机, 其它的设备做PHP环境。先来看下环境的分布:

192.168.0.107(本机IP,配置PHP环境, 域名zl.com blog.zl.com配置在这上面)

192.168.0.101(Redis主机, 配置在虚拟机上面,端口6380)

192.168.0.105(虚拟机, 配置完整的PHP环境, pic.zl.com news.zl.com 配置在这上面)

一、先配置Host,做好解析,并在Nginx上面做好server的配置

//配置好Host解析
127.0.0.1 blog.zl.com zl.com www.zl.com
192.168.0.105 pic.zl.com news.zl.com
//配置好虚拟主机
server {
        listen       80;
        server_name  www.zl.com zl.com;
	root   /path/to/zl.com;
	index index.php;
	location ~ \.php(.*)$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
        }
}

二、Redis服务器的配置

配置端口为6380,

安全起见, 设置验证密码  // requirepass 你设置的密码

配置防火墙端口

-A INPUT -m state –state NEW -m udp -p udp –dport 6380 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 6380 -j ACCEPT

Redis 绑定IP  //bind ip1 ip2

注意:
bind ip1 ip2 ip3 ip4
ip1 ip2 ip3 都是本机所属的ip地址,所以, 我在101这台Redis服务器上配置的是 bind 192.168.0.101
如果配置了 bind 192.168.0.107, 这样的话, Redis服务器是访问不到的,

三、功能实现
 1、公共的Redis连接配置, Cookie所属域名的配置
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL && E_NOTICE);


ini_set('session.cookie_domain', '.zl.com'); //这一行的配置大概就是比较关键的配置了,这一行的配置顾名思义,当你访问www.zl.com的时候,Cookie中存储的PHPSESSID都保存
.zl.com下面, 当你再访问blog.zl.com,news.zl.com的时候,都会到这里来读取Cookie中的PHPSESSID,这样肯定能保证Session的唯一性, 也就能保证用记的状态 。
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://192.168.0.101:6380?auth=你的密码'); //Session存储在远程的Redis服务器中

session_start(); 

2、应用

zl.com的代码:

<?php
include_once('../config/config.php');

echo $_SERVER['HTTP_HOST'];
echo '<BR>';
if (empty($_SESSION['test'])) {
    echo '123';
    $_SESSION['test'] = [
        1, 2, 3
    ];
}

print_r($_SESSION);

blog.zl.com中的代码

<?php
include_once('../config/config.php');

echo $_SERVER['HTTP_HOST'];
echo '<BR>';
print_r($_SESSION);  //直接打印Session里面的内容

我们来看下效果。

  

我们再来看下,配置在虚拟机里面的pic.zl.com 和 news.zl.com的效果

<?php
echo 'ip address ='.$_SERVER['SERVER_ADDR'];
echo ' domain name ='.$_SERVER['HTTP_HOST'];
ini_set('session.save_handler','redis');
ini_set('session.save_path', 'tcp://192.168.0.101:6380?auth=myredis');
session_start();

//为了进一步说明, 我们在这里向Session内添加数据
$_SESSION['remote'] = array('ip' => '192.168.0.105');
echo '<br>';
var_dump($_SESSION);

虽然服务器在不同的地方, 但读取到的Session内容都是一样的

我们再刷新一下zl.com和blog.zl.com,看一下, 在0.105上面追加的Session信息, 是否能同步过来

OK,实验结束。

0

1 thought on “PHP+redis实现session共享功能”

  1. Aw, this was an incredibly good post. Spending some time and actual effort to make a
    good article… but what can I say… I hesitate a lot and never seem to
    get nearly anything done.

发表评论

电子邮件地址不会被公开。