php使用MySQL保存session会话的方法
程序员文章站
2022-06-22 20:31:55
本文实例讲述了php使用mysql保存session会话的方法。分享给大家供大家参考。具体分析如下:
在很多大的系统中一般都有这个功能,但是要分离出来分析,网上靠谱的资料...
本文实例讲述了php使用mysql保存session会话的方法。分享给大家供大家参考。具体分析如下:
在很多大的系统中一般都有这个功能,但是要分离出来分析,网上靠谱的资料也不太多 这里我整理了一篇发出来与大家分享
使用mysql保存session会话较files有很多优点:
1) 有利于分布式系统,files只能保存在一台机器上
2) 有利于大访问量的系统,使用files时每个session保存在一个文件中,目录会超级大,查找session文件会比较困难。
//////使用mysql保存会话首先要创建session表: <?php $hostname_login = "localhost"; // server address $username_login = "root"; // user name $password_login = ""; // password // $data_name = "session"; // database name $login = mysql_pconnect($hostname_login, $username_login, $password_login) or trigger_error(mysql_error(),e_user_error); $sql="show databases like '".$data_name."'"; // if it is exist if($rs_table=mysql_query($sql,$login)) { if($rs_value=mysql_fetch_array($rs_table)) { echo "数据库已经存在!\n!"; exit(); } } $sql="create database $data_name"; mysql_query($sql); // crate database echo "数据库创建成功!\n"; mysql_select_db($data_name, $login); $sql="create table `sessions` ( `sessionkey` varchar(32) not null default '', `sessionarray` blob not null, `sessionexptime` int(20) unsigned not null default '0', primary key (`sessionkey`), key `sessionkey` (`sessionkey`) ) engine=myisam default charset=utf8"; //新建数据库 sql语句 mysql_query($sql); echo "成功新建数据库表!"; ?>
/////////mysqlsession 类如下: <?php class mysqlsession { // 注意在有使用session的页面。页面一定要顶格,页面开始处不能留空。 private $db_server = "localhost"; // 数据库服务器主机名 private $db_name = ""; // 数据库名字 private $db_user = "root"; // mysql 数据库访问用户名 private $db_pass = ""; // mysql 数据库访问密码 private $db_select_db = ""; //private $sess_life = 1440; // session的最大使用时长,单位秒。 private $sess_life = 0; function mysqlsession (&$sessiondb) { //session_write_close(); $this->db_name = &$sessiondb; $this->sess_life = get_cfg_var("session.gc_maxlifetime"); session_module_name('user'); session_set_save_handler( array(&$this, 'sess_open'), array(&$this, 'sess_close'), array(&$this, 'sess_read'), array(&$this, 'sess_write'), array(&$this, 'sess_destroy'), array(&$this, 'sess_gc') ); session_start(); } function sess_open($save_path, $session_name){ // 打开数据库连接 if (! $this->db_select_db = mysql_pconnect($this->db_server, $this->db_user, $this->db_pass)) { echo "sorry! mysql error : can't connect to $this->db_server as $db_user"; echo "mysql error: ", mysql_error(); die; } if (! mysql_select_db($this->db_name, $this->db_select_db)) { echo "sorry! mysql error : unable to select database $this->db_name"; die; } return true; } function sess_close() { return true; } function sess_read($sessionkey){ $query = "select sessionarray from sessions where sessionkey = '".$sessionkey."' and sessionexptime > " . time(); // 过期不读取。 $result = mysql_query($query, $this->db_select_db); if (list($sessionarray) = mysql_fetch_row($result)) { return $sessionarray; } return false; } function sess_write($sessionkey, $varray) { $sessionexptime = time() + $this->sess_life; // 更新session过期时间, //session过期时间 = 最后一次更新时间 + session的最大使用时长 $sessionarray = addslashes($varray); $query = "insert into sessions (sessionkey,sessionexptime,sessionarray) values ('".$sessionkey."','".$sessionexptime."','".$sessionarray."')"; $result = mysql_query($query, $this->db_select_db); if (!$result){ $query = "update sessions set sessionexptime = '".$sessionexptime."', sessionarray = '".$sessionarray."' where sessionkey = '".$sessionkey."' and sessionexptime > " . time(); $result = mysql_query($query, $this->db_select_db); } return $result; } function sess_destroy($sessionkey) { $query = "delete from sessions where sessionkey = '".$sessionkey."'"; $result = mysql_query($query, $this->db_select_db); return $result; } function sess_gc($maxlifetime) { // 这个垃圾清除器系统调用。 //默认是1440秒清除一次。参数可以在php.ini里面设置。 $query = "delete from sessions where sessionexptime < " . time(); $result = mysql_query($query, $this->db_select_db); return mysql_affected_rows($this->db_select_db); } } ?> //用法:在原来使用 session_start 的地方,替换成 $session = new mysqlsession () //注意:包含此程序前要打开数据库,主程序退出前不能关闭数据库,否则会出错。
希望本文所述对大家的php程序设计有所帮助。