http://www.cnblogs.com/zjfazc/archive/2012/09/06/2673803.html php默认使用文件来保存session数据,我们可以定义自己的session处理器来将session信息保存到数据库或其他地方 下面是php.ini中session的配置说明: session.save_handler=files ;存储和检索
http://www.cnblogs.com/zjfazc/archive/2012/09/06/2673803.html
php默认使用文件来保存session数据,我们可以定义自己的session处理器来将session信息保存到数据库或其他地方
下面是php.ini中session的配置说明:
session.save_handler = "files"
; 存储和检索与会话关联的数据的处理器名字。默认为文件("files")。
; 如果想要使用自定义的处理器(如基于数据库的处理器),可用"user"。
; 有一个使用PostgreSQL的处理器:http://sourceforge.net/projects/phpform-ext/
session.save_path = "/tmp"
; 传递给存储处理器的参数。对于files处理器,此值是创建会话数据文件的路径。
; Windows下默认为临时文件夹路径。
; 你可以使用"N;[MODE;]/path"这样模式定义该路径(N是一个整数)。
; N表示使用N层深度的子目录,而不是将所有数据文件都保存在一个目录下。
; [MODE;]可选,必须使用8进制数,默认600(=384),表示每个目录下最多保存的会话文件数量。
; 这是一个提高大量会话性能的好主意。
; 注意0: "N;[MODE;]/path"两边的双引号不能省略。
; 注意1: [MODE;]并不会改写进程的umask。
; 注意2: php不会自动创建这些文件夹结构。请使用ext/session目录下的mod_files.sh脚本创建。
; 注意3: 如果该文件夹可以被不安全的用户访问(比如默认的"/tmp"),那么将会带来安全漏洞。
; 注意4: 当N>0时自动垃圾回收将会失效,具体参见下面有关垃圾搜集的部分。
session.name = "PHPSESSID"
;用在cookie里的会话ID标识名,只能包含字母和数字。
session.auto_start = Off
; 在客户访问任何页面时都自动初始化会话,默认禁止。
; 因为类定义必须在会话启动之前被载入,所以若打开这个选项,你就不能在会话中存放对象。
session.serialize_handler = "php"
; 用来序列化/解序列化数据的处理器,php是标准序列化/解序列化处理器。
; 另外还可以使用"php_binary"。当启用了WDDX支持以后,将只能使用"wddx"。
session.gc_probability = 1
session.gc_divisor = 100
; 定义在每次初始化会话时,启动垃圾回收程序的概率。
; 这个收集概率计算公式如下:session.gc_probability/session.gc_divisor
; 对会话页面访问越频繁,概率就应当越小。建议值为1/1000~5000。
session.gc_maxlifetime = 1440
; 超过此参数所指的秒数后,保存的数据将被视为'垃圾'并由垃圾回收程序清理。
; 判断标准是最后访问数据的时间(对于FAT文件系统是最后刷新数据的时间)。
; 如果多个脚本共享同一个session.save_path目录但session.gc_maxlifetime不同,
; 那么将以所有session.gc_maxlifetime指令中的最小值为准。
; 如果使用多层子目录来存储数据文件,垃圾回收程序不会自动启动。
; 你必须使用一个你自己编写的shell脚本、cron项或者其他办法来执行垃圾搜集。
; 比如,下面的脚本相当于设置了"session.gc_maxlifetime=1440" (24分钟):
; cd /path/to/sessions; find -cmin +24 | xargs rm
session.referer_check =
; 如果请求头中的"Referer"字段不包含此处指定的字符串则会话ID将被视为无效。
; 注意:如果请求头中根本不存在"Referer"字段的话,会话ID将仍将被视为有效。
; 默认为空,即不做检查(全部视为有效)。
session.entropy_file = ;"/dev/urandom"
; 附加的用于创建会话ID的外部高熵值资源(文件),
; 例如UNIX系统上的"/dev/random"或"/dev/urandom"
session.entropy_length = 0
; 从高熵值资源中读取的字节数(建议值:16)。
session.use_cookies = On
; 是否使用cookie在客户端保存会话ID
session.use_only_cookies = Off
; 是否仅仅使用cookie在客户端保存会话ID
; 打开这个选项可以避免使用URL传递会话带来的安全问题。
; 但是禁用Cookie的客户端将使会话无法工作。
session.cookie_lifetime = 0
; 传递会话ID的Cookie有效期(秒),0 表示仅在浏览器打开期间有效。
session.cookie_path = "/"
; 传递会话ID的Cookie作用路径。
session.cookie_domain =
; 传递会话ID的Cookie作用域。
; 默认为空表示表示根据cookie规范生成的主机名。
session.cookie_secure = Off
; 是否仅仅通过安全连接(https)发送cookie。
session.cookie_httponly = Off
; 是否在cookie中添加httpOnly标志(仅允许HTTP协议访问),
; 这将导致客户端脚本(JavaScript等)无法访问该cookie。
; 打开该指令可以有效预防通过XSS攻击劫持会话ID。
session.cache_limiter = "nocache"
; 设为{nocache|private|public}以指定会话页面的缓存控制模式,
; 或者设为空以阻止在http应答头中发送禁用缓存的命令。
session.cache_expire = 180
; 指定会话页面在客户端cache中的有效期限(分钟)
; session.cache_limiter=nocache时,此处设置无效。
session.use_trans_sid = Off
; 是否使用明码在URL中显示SID(会话ID)。
; 默认是禁止的,因为它会给你的用户带来安全危险:
; 1- 用户可能将包含有效sid的URL通过email/irc/QQ/MSN…途径告诉给其他人。
; 2- 包含有效sid的URL可能会被保存在公用电脑上。
; 3- 用户可能保存带有固定不变sid的URL在他们的收藏夹或者浏览历史纪录里面。
; 基于URL的会话管理总是比基于Cookie的会话管理有更多的风险,所以应当禁用。
session.bug_compat_42 = On
session.bug_compat_warn = On
; PHP4.2之前的版本有一个未注明的"BUG":
; 即使在register_globals=Off的情况下也允许初始化全局session变量,
; 如果你在PHP4.3之后的版本中使用这个特性,会显示一条警告。
; 建议关闭该"BUG"并显示警告。
session.hash_function = 0
; 生成SID的散列算法。SHA-1的安全性更高一些
; 0: MD5 (128 bits)
; 1: SHA-1 (160 bits)
; 建议使用SHA-1。
session.hash_bits_per_character = 4
; 指定在SID字符串中的每个字符内保存多少bit,
; 这些二进制数是hash函数的运算结果。
; 4: 0-9, a-f
; 5: 0-9, a-v
; 6: 0-9, a-z, A-Z, "-", ","
; 建议值为 5
url_rewriter.tags = "a=href,area=href,frame=src,form=,fieldset="
; 此指令属于PHP核心部分,并不属于Session模块。
; form和fieldset比较特殊:
; 如果你包含他们,URL重写器将添加一个隐藏的" ",它包含了本应当额外追加到URL上的信息。
; 如果要符合XHTML标准,请去掉form项并在表单字段前后加上
标记。
; 注意:所有合法的项都需要一个等号(即使后面没有值)。
; 推荐值为"a=href,area=href,frame=src,input=src,form=fakeentry"。
将session信息写入到mysql数据库中
<?php <br><span>/*</span><span>============================文件说明======================================== <br>@filename: session.class.php <br>@description: 数据库保存在线用户session,实现在线用户功能! <br>@notice: session过期时间一个小时,因为我们的站点是使用cookie(有效时间是1小时)登录。 <br> 因此我们只记录用户登录的时间,而不是刷新一次更新一次 <br> 删除数据库中session记录的动作发生在用户超时后执行这个文件或正常退出(session_destory) <br>@database: database:sessions field:sessionid(char32),uid(int10),last_visit(int10) <br>@author: duanjianbo <br>@adddate 2008-8-29 <br>=============================================================================<br></span><span>*/</span>
<span>class</span><span> session {
</span><span>private</span> <span>$db</span><span>;
</span><span>private</span> <span>$lasttime</span>=3600;<span>//</span><span>超时时间:一个小时</span>
<span>function</span> session(&<span>$db</span><span>) {
</span><span>$this</span>->db = &<span>$db</span><span>;
</span><span>session_module_name</span>('user'); <span>//session文件保存方式,这个是必须的!除非在Php.ini文件中设置了</span>
<span>session_set_save_handler</span><span>(
</span><span>array</span>(&<span>$this</span>, 'open'), <span>//</span><span>在运行session_start()时执行</span>
<span>array</span>(&<span>$this</span>, 'close'), <span>//</span><span>在脚本执行完成或调用session_write_close() 或 session_destroy()时被执行,即在所有session操作完后被执行 </span>
<span>array</span>(&<span>$this</span>, 'read'), <span>//</span><span>在运行session_start()时执行,因为在session_start时,会去read当前session数据</span>
<span>array</span>(&<span>$this</span>, 'write'), <span>//</span><span>此方法在脚本结束和使用session_write_close()强制提交SESSION数据时执行</span>
<span>array</span>(&<span>$this</span>, 'destroy'), <span>//</span><span>在运行session_destroy()时执行</span>
<span>array</span>(&<span>$this</span>, 'gc') <span>//</span><span>执行概率由session.gc_probability 和 session.gc_divisor的值决定,时机是在open,read之后,session_start会相继执行open,read和gc</span>
<span> );
</span><span>session_start</span>(); <span>//</span><span>这也是必须的,打开session,必须在session_set_save_handler后面执行</span>
<span> }
</span><span>function</span> unserializes(<span>$data_value</span><span>) {
</span><span>$vars</span> = <span>preg_split</span><span>(
</span>'/([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\|/',
<span>$data_value</span>, -1, PREG_SPLIT_NO_EMPTY |<span>
PREG_SPLIT_DELIM_CAPTURE
);
</span><span>for</span> (<span>$i</span> = 0; <span>isset</span>(<span>$vars</span>[<span>$i</span>]); <span>$i</span>++<span>) {
</span><span>$result</span>[<span>$vars</span>[<span>$i</span>++]] = <span>unserialize</span>(<span>$vars</span>[<span>$i</span><span>]);
}
</span><span>return</span> <span>$result</span><span>;
}
</span><span>function</span> open(<span>$path</span>, <span>$name</span><span>) {
</span><span>return</span> <span>true</span><span>;
}
</span><span>function</span><span> close() {
</span><span>$this</span>->gc(<span>$this</span>-><span>lasttime);
</span><span>return</span> <span>true</span><span>;
}
</span><span>function</span> read(<span>$SessionKey</span><span>){
</span><span>$sql</span> = "SELECT uid FROM sessions WHERE session_id = '".<span>$SessionKey</span>."' limit 1"<span>;
</span><span>$query</span> =<span>$this</span>->db->query(<span>$sql</span><span>);
</span><span>if</span>(<span>$row</span>=<span>$this</span>->db->fetch_array(<span>$query</span><span>)){
</span><span>return</span> <span>$row</span>['uid'<span>];
}</span><span>else</span><span>{
</span><span>return</span> ""<span>;
}
}
</span><span>function</span> write(<span>$SessionKey</span>,<span>$VArray</span><span>) {
</span><span>require_once</span>(MRoot.DIR_WS_CLASSES .'db_mysql_class.php'<span>);
</span><span>$db1</span>=<span>new</span><span> DbCom();
</span><span>//</span><span> make a connection to the database... now</span>
<span>$db1</span>->connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD,<span> DB_DATABASE);
</span><span>$db1</span>->query("set names utf8"<span>);
</span><span>$this</span>->db=<span>$db1</span><span>;
</span><span>$SessionArray</span> = <span>addslashes</span>(<span>$VArray</span><span>);
</span><span>$data</span>=<span>$this</span>->unserializes(<span>$VArray</span><span>);
</span><span>$sql0</span> = "SELECT uid FROM sessions WHERE session_id = '".<span>$SessionKey</span>."' limit 1"<span>;
</span><span>$query0</span> =<span>$this</span>->db->query(<span>$sql0</span><span>);
</span><span>if</span>(<span>$this</span>->db->num_rows(<span>$query0</span>)){
<span>if</span> (<span>isset</span>(<span>$data</span>['webid']) && !<span>empty</span>(<span>$data</span>['webid'<span>])) {
</span><span>$this</span>->db->query("insert into `sessions` set `session_id` = '<span>$SessionKey</span>',uid='".<span>$data</span>['webid']."',last_visit='".<span>time</span>()."'"<span>);
}
</span><span>return</span> <span>true</span><span>;
}</span><span>else</span><span>{
</span><span>/*</span><span>$sql = "update `sessions` set ";
if(isset($data['webid'])){
$sql .= "uid = '".$data['webid']."', " ;
}
$sql.="`last_visit` = null "
. "where `session_id` = '$SessionKey'";
$this->db->query($sql); </span><span>*/</span>
<span>return</span> <span>true</span><span>;
}
}
</span><span>function</span> destroy(<span>$SessionKey</span><span>) {
</span><span>$this</span>->db->query("delete from `sessions` where `session_id` = '<span>$SessionKey</span>'"<span>);
</span><span>return</span> <span>true</span><span>;
}
</span><span>function</span> gc(<span>$lifetime</span><span>) {
</span><span>$this</span>->db->query("delete from `sessions` where unix_timestamp(now()) -`last_visit` > '".<span>$this</span>->lasttime."'"<span>);
</span><span>return</span> <span>true</span><span>;
}
}
</span>?>