session存入数据库

我们首先写一个存储类(注意这里没有对DB操作进行封装),暂叫session.class.php:

<?php

class session_mysql

{

private $_db_link;

private $_table;

//这个是SESSION的回收周期(秒)

private $_gc_lifetime = 30;

public function __construct($host, $user, $pwd, $db, $table = 'session', $sessionName = '', $cookieLife = 0)

{
session_module_name("user");/设置session保持方式,或者ini_set('session.save_handler','user')
 

$this->_db_link = mysql_connect ( $host, $user, $pwd );

if (! $this->_db_link)

{

return False;

}

if (mysql_query ( "USE $db" ))

{

$this->_table = $table;

session_set_save_handler ( array (&$this, 'open' ), array (&$this, 'close' ), array (&$this, 'read' ), array (&$this, 'write' ), array (&$this, 'destroy' ), array (&$this, 'gc' ) );

//周期

$cookieLife = intval ( $cookieLife );

if ($cookieLife > 0)

{

session_set_cookie_params ( $cookieLife );

}

if ($this->_gc_lifetime > 0)

{

ini_set ( 'session.gc_maxlifetime', $this->_gc_lifetime );

} else

{

$this->_gc_lifetime = ini_get ( 'session.gc_maxlifetime' );

}

//名称

if (! empty ( $sessionName ))

{

ini_set ( 'session.name', $sessionName );

}

return session_start ();

}

return False;

}

public function open($save_path, $session_name)

{

return true;

}

public function close()

{

//删除过期的SESSION

$this->gc ( $this->_gc_lifetime );

//关闭数据库

//(注意如果系统其它功能和SESSION共用一个数据库,此处关闭可能会影响到其它功能,根据实际情况而定)

return mysql_close ( $this->_db_link );

}

public function read($id)

{

$id = mysql_real_escape_string ( $id );

$sql = "select `data` from `$this->_table` where `id`='$id' limit 1";

if ($result = mysql_fetch_assoc ( mysql_query ( $sql, $this->_db_link ) ))

{

return $result ['data'];

}

return '';

}

public function write($id, $data)

{

$time = time ();

$id = mysql_real_escape_string ( $id );

$data = mysql_real_escape_string ( $data );

$sql = "replace into `$this->_table` values('$id','$data',$time)";

return mysql_query ( $sql, $this->_db_link );

}

public function destroy($id)

{

$sql = "delete from `$this->_table` where `id`='$id' limit 1";

return mysql_query ( $sql, $this->_db_link );

}

public function gc($lifetime)

{

$expire = time () - $lifetime;

$sql = "delete from `$this->_table where `created_time` < $expire";

return mysql_query ( $sql, $this->_db_link );

}

}

 

接着我们写一个公用的方法,暂叫function.php:

<?php

function my_session_start($sessionName = '', $lifetime = 0)

{

//这里装载SESSION类(由于这里方便演示,文件结构分布不严谨)

require_once './session.class.php';

//配置好相关内容

$session = new session_mysql ( '127.0.0.1', 'xxx', 'xxx', 'test', 'session', $sessionName, $lifetime );

if ($session)

{

return True;

}

return False;

}

 

最后,我们来测试一下效果,test.php:

<?php

//测试一下

require_once './function.php';

error_reporting ( E_ALL );

my_session_start ();

$_SESSION ['test'] = 'test';

$_SESSION ['testtwo'] = array ('testtwo' );


我们再在另外一个页面输出SESSION,test2.php

<?php

require_once './function.php';

error_reporting ( E_ALL );

my_session_start ();

var_dump($_SESSION);

 

运行后我们可以看到:

array 'test' =>string'test'(length=4) 'testtwo' =>array 0 =>string'testtwo'(length=7)


 恩,一切正常。我们再看一下数据库中是什么:



恩,浏览器里又是怎么样的呐(这里只测试了FIREFOX,在生产时请务必各浏览器都要测试一下)?




恩,好了以就是一个简单的例子,那么如果我们要使用特殊的SESSION NAME或者要求有过期时间呐?test.php

<?php

//测试一下特殊名称

require_once './function.php';

error_reporting ( E_ALL );

my_session_start ( 'testhehe', 60 );//一分钟

$_SESSION ['lifettimetest'] = 'ok';

 

恩,我们来获取看看:test2.php

<?php

//测试一下特殊名称

require_once './function.php';

error_reporting ( E_ALL );

my_session_start ( 'testhehe' );

var_dump ( $_SESSION );


恩,我们来输出:

array 'lifettimetest' =>string'ok'(length=2)恩,貌似正常,我们再看看数据库与浏览器里的值:(数据库)


这样看来我们测试成功了。好了,以上就是关于session_set_save_handler的操作方法了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHP中可以通过`session_set_save_handler()`函数来自定义session储方式,例如将session储到数据库中。 以下是一个将session储到MySQL数据库中的示例代码: ```php <?php // 自定义session储处理器 class MySessionHandler implements SessionHandlerInterface { private $db; public function open($save_path, $session_name) { $this->db = mysqli_connect("localhost", "username", "password", "database_name"); return true; } public function close() { mysqli_close($this->db); return true; } public function read($session_id) { $session_id = mysqli_real_escape_string($this->db, $session_id); $query = "SELECT session_data FROM session_table WHERE session_id = '$session_id'"; $result = mysqli_query($this->db, $query); if ($result) { $row = mysqli_fetch_assoc($result); return $row['session_data']; } return ''; } public function write($session_id, $session_data) { $session_id = mysqli_real_escape_string($this->db, $session_id); $session_data = mysqli_real_escape_string($this->db, $session_data); $query = "REPLACE INTO session_table (session_id, session_data) VALUES ('$session_id', '$session_data')"; mysqli_query($this->db, $query); return true; } public function destroy($session_id) { $session_id = mysqli_real_escape_string($this->db, $session_id); $query = "DELETE FROM session_table WHERE session_id = '$session_id'"; mysqli_query($this->db, $query); return true; } public function gc($maxlifetime) { $maxlifetime = intval($maxlifetime); $query = "DELETE FROM session_table WHERE session_timestamp < " . (time() - $maxlifetime); mysqli_query($this->db, $query); return true; } } // 注册自定义session储处理器 $handler = new MySessionHandler(); session_set_save_handler($handler, true); // 启动session session_start(); ``` 在上面的示例中,我们创建了一个名为`MySessionHandler`的自定义session储处理器,并实现了`SessionHandlerInterface`接口中的所有方法。其中,`open()`方法用于打开数据库连接;`close()`方法用于关闭数据库连接;`read()`方法用于从数据库中读取指定session ID的session数据;`write()`方法用于将session数据保数据库中;`destroy()`方法用于删除指定session ID的session数据;`gc()`方法用于清除过期的session数据。 最后,我们将自定义session储处理器注册到PHP中,然后启动session即可。 注意,在实际生产环境中,需要根据实际情况对代码进行修改和优化,以确保安全性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值