默认情况下,PHP 使用内置的文件会话保存管理器(files)来完成会话的保存。我们无需设置,PHP默认将session以文件的形式保存到服务器。
通过调用函数 session_start()
即可手动开始一个会话。如果配置项 session.auto_start
设置为1, 那么请求开始的时候,会话会自动开始。
PHP也提供了自定义会话保存管理器功能。有时候我们希望session可以保存到其他地方,如数据库。
自 PHP 5.4 开始,可以使用下面的方式来注册自定义会话存储函数:
bool session_set_save_handler ( SessionHandlerInterface $sessionhandler [, bool $register_shutdown = true ] )
需要实现类里的open
,write
,read
,destroy
,gc
,close
方法。
<?php
class MySessionHandler implements SessionHandlerInterface{
public function open($save_path, $session_id)
{
return true;
}
/**
* 写session
*/
public function write($session_id, $session_data)
{
// TODO: Implement write() method.
}
/**
* 读取session
*/
public function read($session_id)
{
// TODO: Implement read() method.
}
/**
* 删除指定session
*/
public function destroy($session_id)
{
// TODO: Implement destroy() method.
}
/**
* 销毁过期session
*/
public function gc($maxlifetime)
{
// TODO: Implement gc() method.
}
public function close()
{
return true;
}
}
$handler = new MySessionHandler ();
session_set_save_handler ( $handler , true );
session_start ();
分布式存储
当多台服务器负载均衡使用时,这时候还在使用默认的文件存储session方式,就会造成session不同步。这时候我们可以把session存储到同一个地方,如上面的mysql存储session方式。下面看看memcache、redis等如何存储session。
一些 PHP 扩展提供了内置的会话管理器,例如:redis, memcache, 可以通过配置项 session.save_handler
来使用它们。
对于文件会话保存管理器,会将会话数据保存到配置项 session.save_path
所指定的位置。
对于缓存类保存管理器,会将会话数据保存到配置项 session.save_path
所指定的地址。
Memcache
<?php
ini_set("session.save_handler", "memcache"); // memcache
ini_set("session.save_path", "127.0.0.1:11211"); // 不要tcp:
session_start();
$mem = new memcache();
$mem->addServer('127.0.0.1', '11211');
//测试memcache是否正常
//$mem->add('uid', 6, 0, 3600);
//echo $mem->get('uid');
//设置一个session
//$_SESSION['uid'] = 10;
//var_dump($_SESSION);
//查看session在memcache里的存储
echo $mem->get(session_id());
Redis
<?php
ini_set("session.save_handler", "redis"); // memcache
ini_set("session.save_path", "127.0.0.1:6379"); // 不要tcp:
session_start();
$redis = new redis();
$redis->connect('127.0.0.1', '6379');
//测试redis是否正常
//$redis->set('uid', 6, 3600);
//echo $redis->get('uid');
//设置一个session
$_SESSION['uid'] = 10;
//var_dump($_SESSION);
//查看session在redis里的存储
var_dump($redis->get('PHPREDIS_SESSION:'.session_id()))