默认情况下,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()))

 

posted on 2018-03-27 22:12  程序猿的点滴生活  阅读(122)  评论(0编辑  收藏  举报