启动会话 ? 注册会话 ? 使用会话 ? 删除会话
1.启动会话
session_start()
通过session_register()函数创建会话
session_register()函数用来为会话登录一个变量来隐含地启动会话,但要求php.ini文件的选项,将register_globals指令设置on,
然后重新启动apache服务器。
注意:调用session_register()时,不需要调用session_start()函数,php会在注册变量后隐含的调用session_start()函数。
2.注册会话
会话启动后,全部保存在$_session中。通过数组$_session创建一个会话变量很容易,只要直接该数组添加元素即可。
3.使用会话
首先判断会话变量是否有一个会话id存在,不存在就创建一个,并且使其能通过全局数组$_session 进行访问。如存在,则讲这个会话变量载入以供用户使用。
例如,判断用户名session会话变量是否为空,不为空则复制给$myvalue,
4.删除会话
(1)删除单个会话
使用unset(),但是不能使用unset($_session) 函数会将全局变量$_session销毁,无法恢复,用户也不能再注册$_session 变量。
unset ( $_session [ ' user ' ]);
(2)删除多个会话
$_session = array ();
(3)结束会话
session_destroy ();
session设置时间
1.客户端没禁止cookie
(1) session_set_cookie_params() 必须在 session_start() 之前调用
说明:不推荐使用此函数,一些浏览器有问题。
(2) 使用setcookie()
2.客户端禁止cookie
(1)登录之前打开cookie,很多论坛这么做
(2)通过get方法,隐藏表单传递session_id (常用)
(3)使用文件或数据库存储session_id,页面传递中手动调用
======================分===========割============线================
session高级应用
1.session临时文件
session_save_path()存储session临时文件,可缓解因临时文件的存储导致服务器效率降低和站点打开缓慢的问题
示例:
注意:session_save_path()在session_start()函数之间
2.session缓存
session缓存是将内容存储在ie客户端的temporary internet files 文件夹下,可设置缓存时间,下次读取缓存内容,从而提速。
session 缓存使用 session_cache_limiter() 函数
string session_cache_limiter ([ string cache_limiter])
参数cache_limiter为public 或private。同时session缓存不在服务器端而是在客户端缓存,在服务器没显示。
缓存时间,使用 session_cache_expire() 函数
int session_cache_expire ([int new_cache_expire])
示例:
3.session数据库存储
session_set_save_handler()函数
bool session_set_save_handler ( string open , string close , string read , string write , string destroy , string gc)
参数 说明
open(save_path,session_name) 找到session存储地址,去除变量
close() 不需要参数,关闭数据库
read(key) 读取session键值,key对应session_id
write(key,data) 其中data对应设置的session变量
destroy(key) 注销session对应session键值
gc(expiry_time) 清除过期session记录
示例:
$time; $result = mysql_query($sql,$handle); $row = mysql_fetch_array($result); if ($row) { return($row['session_data']); // 返回session名称及内容 }else { return(false); }}function _session_write($key,$data){ global $handle; $time = 60*60; // 设置失效时间 $lapse_time = time() + $time; // 得到unix时间戳 $sql = select session_data from tb_session where session_key = '$key' and session_time > $lapse_time; $result = mysql_query($sql,$handle); if (mysql_num_rows($result) == 0 ) // 没有结果 { $sql = insert into tb_session values('$key','$data',$lapse_time); // 插入数据库sql语句 $result = mysql_query($sql,$handle); }else { $sql = update tb_session set session_key = '$key',session_data = '$data',session_time = $lapse_time where session_key = '$key'; // 修改数据库sql语句 $result = mysql_query($sql,$handle); } return($result);}function _session_destroy($key){ global $handle; $sql = delete from tb_session where session_key = '$key'; // 删除数据库sql语句 $result = mysql_query($sql,$handle); return($result);}function _session_gc($expiry_time){ global $handle; $lapse_time = time(); // 将参数$expiry_time赋值为当前时间戳 $sql = delete from tb_session where expiry_time
======================分===========割============线================