利用session_set_save_handler()函数将session保存到MySQL数据库中

PHP保存session默认的是采用的文件的方式来保存的,这仅仅在文件的空间开销很小的windows上是可以采用的,但是如果我们采用uinx或者是liux上的文件系统的时候,这样的文件系统的文件空间开销是很大的,然而session是要时时刻刻的使用的,大量的用户就要创建很多的session文件,这样对整个的服务器带来性能问题。

另一方面,如果服务器起采用群集的方式的话就不能保持session的一致性,所以我们就绪要采用数据库的方式来保存session,这样,不管有几台服务器同时使用,只要把他们的session保存在一台数据库服务器上就可以保证session的完整了,具体如何来实现请继续看下去。

PHP保存session默认的情况下是采用的文件方式来保存的,我们在PHP的配制文件PHP.ini中可以看到这样的一行,

session.save_handler="files"

这样的意思就是采用文件来保存session 的,要采用数据库来保存的话,我们需要修改成用户模式,改成

session.save_handler="use"

就可以了,但是,这仅仅是说明我门没有采用文件的方式存储session,我们还要选择数据库和建立数据库的表。

建立数据库和数据库的表结构,我们可以采用PHP可以使用的任何的数据库,因为PHP和mysql的结合最好,我就使用mysql来做示例,当然根据你的需要可以改称别的数据库。

创建数据库

create database ‘session‘;

创建表结构

create table ‘session‘( id char(32) not null , ‘user ‘char(30), data char(3000) ,primary key (‘id‘) );

PHP保存session编写PHP文件

<?php
$con = mysql_connect("127.0.0.1", "user" , "pass");
mysql_select_db("session");

function open($save_path, $session_name) {
	return(true);
}

function close() {
	return(true);
}

function read($id) {
	if ($result = mysql_query("select * from session where id=‘$id‘")) {
		if ($row = mysql_felth_row($result)) {
			return $row["data"];
		}
	} else {
		return "";
	}
}

function write($id, $sess_data) {
	if ($result = mysql_query("update session set data=‘$sess_data‘ where id=‘$id‘")) {
		return true;
	} else {
		return false;
	}
}

function destroy($id) {
	if ($result = mysql_query("delete * from session where id=‘$id‘")) {
		return true;
	} else {
		return false;
	}
}

function gc($maxlifetime) {
	return true;
}
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
session_start();
// proceed to use sessions normally
?>

保存成为session_user_start.php。

现在我们的PHP保存session的工作就已经完成了,只要你在需要在使用session的时候,把session_user_start.php包含进来.注意,这个文件一定要在文件的第一行包含,然后就像使用文件的session一样的方法使用就可以了。



以上仅仅是个简单教程,在实际的应用中,可以对它封装得更专业些,参考代码如下:

SessionMysql.class.php

<?php
/**
 * SessionMysql 数据库存储类
 */

defined(‘IN_QIAN‘) or exit(‘Access Denied‘);

class SessionMysql {

	public $lifetime = 1800; // 有效期,单位:秒(s),默认30分钟
	public $db;
	public $table;

	/**
	 * 构造函数
	 */
	public function __construct() {
		$this->db = Base::loadModel(‘SessionModel‘);
		$this->lifetime = Base::loadConfig(‘system‘, ‘session_lifetime‘);
		session_set_save_handler(
			array(&$this, ‘open‘),		// 在运行session_start()时执行
			array(&$this, ‘close‘),		// 在脚本执行完成 或 调用session_write_close() 或 session_destroy()时被执行,即在所有session操作完后被执行
			array(&$this, ‘read‘),		// 在运行session_start()时执行,因为在session_start时,会去read当前session数据
			array(&$this, ‘write‘),		// 此方法在脚本结束和使用session_write_close()强制提交SESSION数据时执行
			array(&$this, ‘destroy‘),	// 在运行session_destroy()时执行
			array(&$this, ‘gc‘)			// 执行概率由session.gc_probability 和 session.gc_divisor的值决定,时机是在open,read之后,session_start会相继执行open,read和gc
		);
		session_start(); // 这也是必须的,打开session,必须在session_set_save_handler后面执行
	}

	/**
	 * session_set_save_handler open方法
	 *
	 * @param $savePath
	 * @param $sessionName
	 * @return true
	 */
	public function open($savePath, $sessionName) {
		return true;
	}

	/**
	 * session_set_save_handler close方法
	 *
	 * @return bool
	 */
	public function close() {
		return $this->gc($this->lifetime);
	}

	/**
	 * 读取session_id
	 *
	 * session_set_save_handler read方法
	 * @return string 读取session_id
	 */
	public function read($sessionId) {
		$condition = array(
			‘where‘ => array(
				‘session_id‘ => $sessionId
			),
			‘fields‘ => ‘data‘
		);
		$row = $this->db->fetchFirst($condition);
		return $row ? $row[‘data‘] : ‘‘;
	}

	/**
	 * 写入session_id 的值
	 *
	 * @param $sessionId 会话ID
	 * @param $data 值
	 * @return mixed query 执行结果
	 */
	public function write($sessionId, $data) {
		$userId = isset($_SESSION[‘userId‘]) ? $_SESSION[‘userId‘] : 0;
		$roleId = isset($_SESSION[‘roleId‘]) ? $_SESSION[‘roleId‘] : 0;
		$grouId = isset($_SESSION[‘grouId‘]) ? $_SESSION[‘grouId‘] : 0;
		$m = defined(‘ROUTE_M‘) ? ROUTE_M : ‘‘;
		$c = defined(‘ROUTE_C‘) ? ROUTE_C : ‘‘;
		$a = defined(‘ROUTE_A‘) ? ROUTE_A : ‘‘;
		if (strlen($data) > 255) {
			$data = ‘‘;
		}
		$ip = get_ip();
		$sessionData = array(
			‘session_id‘	=> $sessionId,
			‘user_id‘		=> $userId,
			‘ip‘			=> $ip,
			‘last_visit‘	=> SYS_TIME,
			‘role_id‘		=> $roleId,
			‘group_id‘		=> $grouId,
			‘m‘				=> $m,
			‘c‘				=> $c,
			‘a‘				=> $a,
			‘data‘			=> $data,
		);
		return $this->db->insert($sessionData, 1, 1);
	}

	/**
	 * 删除指定的session_id
	 *
	 * @param string $sessionId 会话ID
	 * @return bool
	 */
	public function destroy($sessionId) {
		return $this->db->delete(array(‘session_id‘ => $sessionId));
	}

	/**
	 * 删除过期的 session
	 *
	 * @param $lifetime session有效期(单位:秒)
	 * @return bool
	*/
	public function gc($lifetime) {
		$expireTime = SYS_TIME - $lifetime;
		return $this->db->delete("`last_visit`<$expireTime");
	}
}
?>

在系统文件的某个地方,实例化这个类即可!!!

new SessionMysql();

延伸阅读:PHP如何将session保存到memcached中?

时间: 2024-12-18 01:16:00

利用session_set_save_handler()函数将session保存到MySQL数据库中的相关文章

使用 PDO 方式将 Session 保存到 MySQL 数据中

类: <?php /* 使用数据库保存session */ class DBHandler implements SessionHandlerInterface { protected $dbh; public function open($save_path, $name) { try { $this->connect($save_path, $name); return true; } catch(PDOException $e) { echo $e->getMessage(); r

php 保存到mysql数据库中的中文乱码

近期又php项目,乱码是个头痛的问题 解决方法: 1,php 文件中 添加 header(“Content-Type: text/html; charset=utf-8"); 2,需要做数据库操作的php程序前加mysql_query("set names '编码'");,编码和php编码一致,如果php编码是gb2312那mysql编码就是gb2312,如果是utf-8那 mysql编码就是 utf8,这样插入或检索数据时就不会出现乱码了 mysql_query("

php将图片以二进制保存到mysql数据库并显示

一.存储图片的数据表结构: -- -- 表的结构 `image` -- CREATE TABLE IF NOT EXISTS `image` ( `id` int(3) NOT NULL AUTO_INCREMENT, `name` varchar(100) CHARACTER SET utf8 NOT NULL, `pic` blob NOT NULL, `type` varchar(50) CHARACTER SET utf8 NOT NULL, `date` datetime NOT NU

Python scrapy爬虫数据保存到MySQL数据库

除将爬取到的信息写入文件中之外,程序也可通过修改 Pipeline 文件将数据保存到数据库中.为了使用数据库来保存爬取到的信息,在 MySQL 的 python 数据库中执行如下 SQL 语句来创建 job_inf 数据表: CREATE TABLE job inf ( id INT (11) NOT NULL AUTO_INCREMENT PRIMARY KEY, title VARCHAR (255), salary VARCHAR (255), company VARCHAR (255),

PHP session_set_save_handler将SESSION保存到Mysql中

将SESSION保存到mysql中 <?php /**  * SessionMysql 数据库存储类  */ defined('IN_QIAN') or exit('Access Denied'); class SessionMysql { public $lifetime = 1800; // 有效期,单位:秒(s),默认30分钟 public $db; public $table; /**  * 构造函数  */ public function __construct() { session

php将图片保存到mysql数据库及从数据库中读取图片的方法源码 转

php将图片保存到mysql数据库及从数据库中读取图片的方法源码 分类: 网站 2012-03-11 15:25 5059人阅读 评论(0) 收藏 举报 数据库mysqlphpsql serverquerydatabase 一般来讲都是把图片保存到服务器下,然后根据路径读出的,但是有时候出于安全及版权什么的考虑,会把图片保存到mysql的数据库中,然后再读出来,这样的图片点击右键属性,是看不到图片地址的.下面逍遥一生就介绍下如何用php把图片存储到mysql中及如何读出.     MySQL数据

python之scrapy爬取数据保存到mysql数据库

1.创建工程 scrapy startproject tencent 2.创建项目 scrapy genspider mahuateng 3.既然保存到数据库,自然要安装pymsql pip install pymysql 4.settings文件,配置信息,包括数据库等 # -*- coding: utf-8 -*- # Scrapy settings for tencent project # # For simplicity, this file contains only setting

关于阿里云centos 2.6下手机表情输入后无法保存到mysql数据库的问题调研及mysql版本从5.1升级到5.7的全过程纪要

近日在开发手机app的评论功能时,输入表情文字,保存后提示数据库保存失败.错误日志片段如下 caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x97\xF0\x9F...' for column 'CONTENT' at row 1 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074) 经过调研发现,这个问题是mysql的ut

上传图片保存到MySql数据库并显示--经验证有效

以下方法仅供参考,只是介绍下这一种方法而已.欢迎指正!! 前台(image.html): 1<html> 2<head> 3<title>上传图片</title> 4</head> 5<body> 6<form method="post" action="upimage.php" enctype="multipart/form-data"><center&g