php mysql session_php将session存入mysql

session有可能因为文件的数量过多,会在查询session文件以及读取的时候产生压力。可以使用session分层来减少查询的压力,但是该方法并没有真正的解决I/O瓶颈问题。将session存入数据库可以实现多站点共享session,控制一个帐号只能一个人登录等功能。

session存放到数据库,一般我们是将session存放到内存(非关系型数据库)。

本例以存到mysql数据库为示例:

数据库结构:CREATE TABLE `session` (

`sess_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,

`sess_info` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,

`sess_expire` int(11) NOT NULL ,

PRIMARY KEY (`sess_id`)

)

ENGINE=MyISAM

DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ciphp代码:

/*打开session*/

function sess_open(){

mysql_connect('127.0.0.1','root','root');

mysql_query("use putsession");

}

/*关闭session*/

function sess_close(){

mysql_close();

}

/*读取session*/

function sess_read($sess_id){

/*根据sess_id查询数据库,获取session信息,过滤过期的数据*/

$expire=time()-ini_get('session.gc_maxlifetime');

$sql="SELECT * FROM session WHERE sess_id='{$sess_id}' AND sess_expire >= {$expire}";

$res=mysql_query($sql);

if($res){

$sess=mysql_fetch_assoc($res);

return $sess['sess_info'];

}

}

/*写入session*/

function sess_write($sess_id,$sess_info){

$time=time();

$sql="REPLACE INTO session VALUES('{$sess_id}','{$sess_info}','{$time}')";

return mysql_query($sql);

}

/*销毁session*/

function sess_destory($sess_id){

$sql="DELETE FROM session WHERE sess_id='{$sess_id}'";

return mysql_query($sql);

}

/*释放资源,垃圾回收*/

function sess_gc(){

/*判断session是否过期,过期删除*/

$expire=time()-ini_get('session.gc_maxlifetime');//最迟的时间,此时间之前的会删除

$sql="DELETE FROM session WHERE sess_expire < $expire";

return mysql_query($sql);

}

/*session入库函数*/

//bool session_set_save_handler (开启session机制函数 ,关闭session机制函数, 读取session数据函数 ,

//写入session函数 , 销毁session函数, 回收过期session函数 )

session_set_save_handler('sess_open','sess_close','sess_read','sess_write','sess_destory','sess_gc');

/*开启session*/

session_start();

$_SESSION['name']='dogs';

$_SESSION['age']=34;

var_dump($_SESSION);

/*销毁session*/

session_destroy();

  • 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、付费专栏及课程。

余额充值