redis集群实现session共享
在两台服务器上通过redis实现session共享:
描述
A服务器:192.168.4.254
B服务器:192.168.4.125
- 此代码的实现依赖于https://github.com/nrk/predis 标准库
- 下载上面的标准库,放到你的根目录下,如predis文件夹。
- 代码中包含predis标准库加载文件require( “predis/autoload.php” );
- 以下是实例代码内容:
require( "predis/autoload.php" );
$single_server = array(
'tcp://192.168.4.254:6379' ,
'tcp://192.168.4.254:6380' ,
'tcp://192.168.4.254:6381' ,
'tcp://192.168.4.125:6382' ,
'tcp://192.168.4.125:6383' ,
'tcp://192.168.4.125:6384' ,
);
$options = array( 'cluster' => 'redis' ,'prefix' => 'sessions:' );
$client = new Predis\Client( $single_server, $options );
$handler = new Predis\Session\Handler( $client, array( 'gc_maxlifetime' => 50 ));
$handler ->register() ;
session_id( 'example_session_id' );
session_start() ;
if ( isset($_SESSION ['foo'])) {
echo "Session has `foo` set to {$_SESSION[ 'foo']}" , PHP_EOL;
} else {
$_SESSION ['foo'] = $value = mt_rand();
echo "Empty session, `foo` has been set with $value ", PHP_EOL;
}
A服务器效果:
B服务器:
因为我是先执行B服务器,后执行A服务器。结果发现他们的session结果是一致的
原理
- 使用到redis集群
- php的session_set_save_handler
- 不要相信网上的所谓的php.ini的session redis配置。集群中根本不实用。我的php.ini中session.save_handler依然是files