php利用mysql保存session的实现思路及示例代码_第1页
php利用mysql保存session的实现思路及示例代码_第2页
php利用mysql保存session的实现思路及示例代码_第3页
php利用mysql保存session的实现思路及示例代码_第4页
php利用mysql保存session的实现思路及示例代码_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实现环境:php 5.4.24mysql 5.6.19os x 10.9.4/apache 2.2.26一、代码Icreate table 'session' (2'skey' char(32) character set ascii not null,3'data' text collate utf8mb4_bin,4'expire' int(11) not null,5primary key ('skey'),6key 'index_session_expire' ('expire

2、9;) using btree7) engine=myisam default charset=utf8mb4 collate=utf8mb4_bin;001<?php002/*003*连接数据库所需的dns、用户名、密码等,一般情况不会在代码中进行更改,004*所以使用常量的形式,可以避免在函数中引用而需要global。005*/006define('session_dns', 'mysql:host=localhost;dbname=db;charset=utf8mb4');007define('session_usr', &#

3、39;usr');008define('session_pwd', 'pwd');009define('session_maxlifetime', get_cfg_var('session.gc_maxlifetime');010011/创建pdo连接012/持久化连接可以提供更好的效率013function getconnection() 014try 015$conn = new pdo(session_dns, session_usr, session_pwd, array(016pdo:attr_persisten

4、t => true,017pdo:attr_errmode => pdo:errmode_exception,018pdo:attr_emulate_prepares => false019);020return $conn;021 catch (exception $ex) 022023024025026自定义的session的open函数027function sessionmysqlopen($savepath, $sessionname) 028return true;029030031自定义的session的close函数032functio

5、n sessionmysqlclose() 033return true;034035/*036*由于一般不会把用户提交的数据直接保存到session,所以普通情况不存在注入问题。037*且处理session数据的sql语句也不会多次使用。因此预处理功能的效益无法体现。038*所以,实际工程中可以不必教条的使用预处理功能。039*/040/*041* sessionmysqlread()函数中,首先通过 select count(*)来判断 sessionid 是否存在。042* 由于 mysql 数据库提供 select 对 pdostatement:rowcount()的支持,043*因此

6、,实际的工程中可以直接使用rowcount()进行判断。044*/045自定义的session的read函数046/sql语句中增加了 " expire > time()”判断,用以避免读取过期的sessioru047function sessionmysqlread($sessionid) 048try 049$dbh = getconnection();050$time = time();051052$sql = 'select count(*) as 'count' from session '053. 'where ske

7、y = ? and expire > ?'054$stmt = $dbh->prepare($sql);055$stmt->execute(array($sessionid, $time);056$data = $stmt->fetch(pdo:fetch_assoc)'count'057if ($data = 0) 058return ''059060061$sql = 'select 'data' from 'session' '062. '

8、;where 'skey' = ? and 'expire' > ?'063$stmt = $dbh->prepare($sql);064$stmt->execute(array($sessionid, $time);065$data = $stmt->fetch(pdo:fetch_assoc)'data'066return $data;067 catch (exception $e) 068return ''069070071072/自定义的session的wri

9、te函数073/expire字段存储的数据为当前时间+session生命期,当这个值小于time()时表明 session 失效。074function sessionmysqlwrite($sessionid, $data) 075try 076$dbh = getconnection();077$expire = time() + session_maxlifetime;078079$sql = 'insert into 'session' ('skey', 'data', 'expire')'080. 

10、9;values (?, ?, ?)'081. 'on duplicate key update data = ?, expire = ?'082$stmt = $dbh->prepare($sql);083$stmt->execute(array($sessionid, $data, $expire, $data, $expire);084 catch (exception $e) 085echo $e->getmessage();086087088089自定义的session的destroy函数090function ses

11、sionmysqldestroy($sessionid) 091try 092$dbh = getconnection();093094$sql = 'delete from 'session' where skey = ?'095$stmt = $dbh->prepare($sql);096$stmt->execute(array($sessionid);097return true;098 catch (exception $e) 099return false;100101102103自定义的session的gc函数104fun

12、ction sessionmysqlgc($lifetime) 105try 106$dbh = getconnection();107108$sql = 'delete from 'session' where expire < ?'109$stmt = $dbh->prepare($sql);110$stmt->execute(array(time();111$dbh = null;112return true;113 catch (exception $e) 114return false;115116117118

13、/自定义的session的session id设置函数 119/*120* 由于在 session_start()之前,sid 和 session_id()均无效,121* 故使用 $_getsession_name()H $_cookiesession_name()进行检测。122*如果此两者均为空,则表明session尚未建立,需要为新session设置session id。123*通过mysql数据库获取uuid作为session id可以更好的避免 session id碰撞。 124*/125function sessionmysqlid() 126if (filter_input(i

14、nput_get, session_name() = '' and127filter_input(input_cookie, session_name() = '') 128try 129$dbh = getconnection();130$stmt = $dbh->query('select uuid() as uuid');131$data = $stmt->fetch(pdo:fetch_assoc)'uuid'132$data = str_replace('-', ",

15、 $data);133session_id($data);134return true;135 catch (exception $ex) 136return false;137 138 139 140 141142/session启动函数,包括了session_start()及其之前的所有步骤。143function startsession() 144session_set_save_handler(145'sessionmysqlopen', 146'sessionmysqlclose', 147'sessionmysqlread', 14

16、8'sessionmysqlwrite', 149'sessionmysqldestroy', 150'sessionmysqlgc');151register_shutdown_function('session_write_close');152sessionmysqlid();153session_start();154二、简介使用 mysql保存 session,需要保存三个关键性的数据: session id、 session数据、session 生命期。考虑到session的使用方式,没必要使用innodb引擎,myi

17、sam引擎可以获得更好的性能。如果环境允许,可以尝试使用memory引擎。保存session数据的列,有需要白话,可以使用 utf8或utf8mb4字符集;保存session id 的列则没有必要,一般情况使用ascii字符集就可以了,可以节约存储成本。保存session生命期的列,可以根据工程需要进行设计。比如 datetime类型、timestamp 类型、int类型。对于datetime、int类型可以保存session生成时间或过期时间。如果有必要可以扩展 session表的列并修改读、写函数以支持(维护)相关列来保存诸 如用户名等信息。当前版本,只要通过session_set_save_handler注册自定义的会话维护函数就可以,不需 要在其之前使用 session_module_name('use)函数。当read函数获取数据并返回,php会自动对其进行反序列化,一般情况请不要对数据进行更改。php传递给write函数的date参数是序列化之后的 session数据,直接保存即可,一般情 况请不要对数据进行更改。按照本段代码的逻辑,php配置选项关于会话生命期的设置已经不再有效,这个值可以 自行维护,不一定需要通过get_cfg_var获取。sessionmysqlid()函数是为了避免大用户量、多台web服务器情况下的碰撞,一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论