解析php session

作者&投稿:郑彩 (若有异议请与网页底部的电邮联系)
~ 本篇文章是对php中session_set_save_handler 函数的用法(mysql)进行了详细的分析介绍 需要的朋友参考下   复制代码 代码如下: <?php /*============================文件说明======================================== @filename: session class php @description: 数据库保存在线用户session 实现在线用户功能! @notice: session过期时间一个小时 因为我们的站点是使用cookie(有效时间是 小时)登录 因此我们只记录用户登录的时间 而不是刷新一次更新一次 删除数据库中session记录的动作发生在用户超时后执行这个文件或正常退出(session_destory) @database: database:sessions field:sessionid(char ) uid(int ) last_visit(int ) ============================================================================= */ class session { private $db; private $lasttime= ;//超时时间 一个小时 function session(&$db) { $this >db = &$db; session_module_name( user ); //session文件保存方式 这个是必须的!除非在Php ini文件中设置了 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后面执行 } function unserializes($data_value) { $vars = preg_split( /([a zA Z_x f xff][a zA Z _x f xff]*)|/ $data_value PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE ); for ($i = ; isset($vars[$i]); $i++) { $result[$vars[$i++]] = unserialize($vars[$i]); } return $result; } function open($path $name) { return true; } function close() { $this >gc($this >lasttime); return true; } function read($SessionKey){ $sql = "SELECT uid FROM sessions WHERE session_id = " $SessionKey " limit "; $query =$this >db >query($sql); if($row=$this >db >fetch_array($query)){ return $row[ uid ]; }else{ return ""; } } function write($SessionKey $VArray) { require_once(MRoot DIR_WS_CLASSES db_mysql_class php ); $db =new DbCom(); // make a connection to the database now $db >connect(DB_SERVER DB_SERVER_USERNAME DB_SERVER_PASSWORD DB_DATABASE); $db >query("set names utf "); $this >db=$db ; $SessionArray = addslashes($VArray); $data=$this >unserializes($VArray); $sql = "SELECT uid FROM sessions WHERE session_id = " $SessionKey " limit "; $query =$this >db >query($sql ); if($this >db >num_rows($query )<= ){ if (isset($data[ webid ]) && !empty($data[ webid ])) { $this >db >query("insert into `sessions` set `session_id` = $SessionKey uid= " $data[ webid ] " last_visit= " time() " "); } return true; }else{ /*$sql = "update `sessions` set "; if(isset($data[ webid ])){ $sql = "uid = " $data[ webid ] " " ; } $sql ="`last_visit` = null " "where `session_id` = $SessionKey "; $this >db >query($sql); */ return true; } } function destroy($SessionKey) { $this >db >query("delete from `sessions` where `session_id` = $SessionKey "); return true; } function gc($lifetime) { $this >db >query("delete from `sessions` where unix_timestamp(now()) `last_visit` > " $this >lasttime " "); return true; } } ?>

   下面是php ini中session的配置说明 session save_handler = "files" 存储和检索与会话关联的数据的处理器名字 默认为文件("files") 如果想要使用自定义的处理器(如基于数据库的处理器) 可用"user" 有一个使用PostgreSQL的处理器 session save_path = "/tmp" 传递给存储处理器的参数 对于files处理器 此值是创建会话数据文件的路径 Windows下默认为临时文件夹路径 你可以使用"N[MODE]/path"这样模式定义该路径(N是一个整数) N表示使用N层深度的子目录 而不是将所有数据文件都保存在一个目录下 [MODE]可选 必须使用 进制数 默认 (= ) 表示每个目录下最多保存的会话文件数量 这是一个提高大量会话性能的好主意 注意 : "N[MODE]/path"两边的双引号不能省略 注意 : [MODE]并不会改写进程的umask 注意 : php不会自动创建这些文件夹结构 请使用ext/session目录下的mod_files sh脚本创建 注意 : 如果该文件夹可以被不安全的用户访问(比如默认的"/tmp") 那么将会带来安全漏洞 注意 : 当N> 时自动垃圾回收将会失效 具体参见下面有关垃圾搜集的部分

   session name = "PHPSESSID" 用在cookie里的会话ID标识名 只能包含字母和数字

   session auto_start = Off 在客户访问任何页面时都自动初始化会话 默认禁止 因为类定义必须在会话启动之前被载入 所以若打开这个选项 你就不能在会话中存放对象

   session serialize_handler = "php" 用来序列化/解序列化数据的处理器 php是标准序列化/解序列化处理器 另外还可以使用"php_binary" 当启用了WDDX支持以后 将只能使用"wddx"

   session gc_probability = session gc_divisor = 定义在每次初始化会话时 启动垃圾回收程序的概率 这个收集概率计算公式如下 session gc_probability/session gc_divisor 对会话页面访问越频繁 概率就应当越小 建议值为 / ~

   session gc_maxlifetime = 超过此参数所指的秒数后 保存的数据将被视为 垃圾 并由垃圾回收程序清理 判断标准是最后访问数据的时间(对于FAT文件系统是最后刷新数据的时间) 如果多个脚本共享同一个session save_path目录但session gc_maxlifetime不同 那么将以所有session gc_maxlifetime指令中的最小值为准 如果使用多层子目录来存储数据文件 垃圾回收程序不会自动启动 你必须使用一个你自己编写的shell脚本 cron项或者其他办法来执行垃圾搜集 比如 下面的脚本相当于设置了"session gc_maxlifetime= " ( 分钟) cd /path/to/sessions find cmin + | xargs rm

   session referer_check = 如果请求头中的"Referer"字段不包含此处指定的字符串则会话ID将被视为无效 注意 如果请求头中根本不存在"Referer"字段的话 会话ID将仍将被视为有效 默认为空 即不做检查(全部视为有效)

   session entropy_file = "/dev/urandom" 附加的用于创建会话ID的外部高熵值资源(文件) 例如UNIX系统上的"/dev/random"或"/dev/urandom"

   session entropy_length = 从高熵值资源中读取的字节数(建议值 )

   session use_cookies = On 是否使用cookie在客户端保存会话ID

   session use_only_cookies = Off 是否仅仅使用cookie在客户端保存会话ID 打开这个选项可以避免使用URL传递会话带来的安全问题 但是禁用Cookie的客户端将使会话无法工作

   session cookie_lifetime = 传递会话ID的Cookie有效期(秒) 表示仅在浏览器打开期间有效

   session cookie_path = "/" 传递会话ID的Cookie作用路径

   session cookie_domain = 传递会话ID的Cookie作用域 默认为空表示表示根据cookie规范生成的主机名

   session cookie_secure = Off 是否仅仅通过安全连接()发送cookie

   session cookie_only = Off 是否在cookie中添加Only标志(仅允许HTTP协议访问) 这将导致客户端脚本(JavaScript等)无法访问该cookie 打开该指令可以有效预防通过XSS攻击劫持会话ID

   session cache_limiter = "nocache" 设为{nocache|private|public}以指定会话页面的缓存控制模式 或者设为空以阻止在应答头中发送禁用缓存的命令

   session cache_expire = 指定会话页面在客户端cache中的有效期限(分钟) session cache_limiter=nocache时 此处设置无效

   session use_trans_sid = Off 是否使用明码在URL中显示SID(会话ID) 默认是禁止的 因为它会给你的用户带来安全危险 用户可能将包含有效sid的URL通过email/irc/QQ/MSN…途径告诉给其他人 包含有效sid的URL可能会被保存在公用电脑上 用户可能保存带有固定不变sid的URL在他们的收藏夹或者浏览历史纪录里面 基于URL的会话管理总是比基于Cookie的会话管理有更多的风险 所以应当禁用

   session bug_pat_ = On session bug_pat_warn = On PHP 之前的版本有一个未注明的"BUG" 即使在register_globals=Off的情况下也允许初始化全局session变量 如果你在PHP 之后的版本中使用这个特性 会显示一条警告 建议关闭该"BUG"并显示警告

   session hash_function = 生成SID的散列算法 SHA 的安全性更高一些 : MD ( bits) : SHA ( bits) 建议使用SHA

   session hash_bits_per_character = 指定在SID字符串中的每个字符内保存多少bit 这些二进制数是hash函数的运算结果 : a f : a v : a z A Z " " " " 建议值为

lishixinzhi/Article/program/PHP/201311/21306




淇县19298829778: PHP中 cookies和SEssion的详细用法 -
捷文头孢: 一、sesion 是一个常用的方法,在不同的编程语言中的用法不一样. 下面就把如何在php中用session和大家分享一下. page1:session.php <?php session_start(); session_register("username"); $_SESSION[''username'']=''user''; ?> 这个页...

淇县19298829778: php中session的用法 -
捷文头孢: SESSION 是服务器全局变量,可以在开启SESSION的情况下在服务器的任何地方赋值(切忌:在开启SESION之前前面不能有任何输出,包括空格之类的)、获取.也就是说你在LOGIN页面登陆保存$_SESION['username'] = 'username';可以在userInfo页面中使用 $username = $_session['username'];获取,print_r($_SESSION)可以查看当前的所有SESSION变量

淇县19298829778: php中的session该怎么理解
捷文头孢: Session是个容器里面保存的当前连接的部分信息,以及编程人员自己存入的一些信息. 由于我们http协议不是一直和服务器连接的当1次请求回应完成后到下一次请求直接其实没和服务器连接 为了实现一直连接的话我们要引入Session这个容器...

淇县19298829778: php session 的原理机制是什么? -
捷文头孢: 首先说一下在php中如何操作session session_start(); //使用该函数打开session功能$_SESSION //使用预定义全局变量操作数据$_SESSION['user'] = 'php'; //定义一个session echo $_SESSION['user']; //输出session 使用unset($_SESSION['...

淇县19298829778: 编程语言php中,session的意思以及详细的介绍(望语言直白些)谢谢啦! -
捷文头孢: session是保存信息用的 ,它保存在服务端,比较安全, 由于 Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容.session 就相当于cookes 服务器对其设置保存时间 比如你设置session保存30分钟 那么你定义的session变量在这30分钟内不会失效 所以登录的时候可以用来检查是否有这条记录,判断是否登录了

淇县19298829778: 解析php框架codeigniter中如何使用框架的session -
捷文头孢: 里面有两种session的使用方法:1是php的原始的session使用方法,这个很简单,$_SESSION['name']="name",然后在需要的地方显示:echo $_SESSION['name'];2是codeigniter这个框架的一个方法:下面就详细讲解如何使用这个有点点复...

淇县19298829778: php 中session的用法 -
捷文头孢: 遇到这个问题首先,要明白你有没有打开session,有没有session_start(),然后检测一下session['user']里有没有值,值是什么,需要再第一个if里把session打印出来

淇县19298829778: php中如何使用SESSION -
捷文头孢: 1、在php中使用session,首先要启动session会话,启动session会话要使用php内置函数session_start(),如图所示. 2、 然后session_start()函数必须位于<html>标签之前才可使用,如图所示. 3、启动 session会话之后,用php内置...

淇县19298829778: php的session 有什么用 -
捷文头孢: session是什么,刚开始我也不明白,非专业词典翻译为会议,会议期.直到接触asp后才知道session是干什么的,有什么用. 作个不太恰当的比喻吧(虽然不恰当,但意义却是一样的),session就好象你和你女友(或妻子)之间的感情似的,...

淇县19298829778: PHP session干嘛用的?举个简单易懂的例子 -
捷文头孢: session是一个会话,以数组形式存在,并且有一定的有效期,存储在服务器端,而且,他的最大的特性就是具有唯一性!所谓的唯一性,就是说,在不同的客户端访问,session的值是不相同的.常用于记录用户的个人信息,比如网站的登录等...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网