php session缓存机制使用体验,哪些场合不适合 简单原理

2014年9月24日 发表评论 阅读评论

今天dota闪电站小猪发现一个插件说是用了这个机制,发现非常不好。我自己发了个帖,到首页列表一看居然没更新!

虽然session会减少对mysql数据的读取,但是像论坛这样频繁公众需要写入的操作,如果建立了session机制就会发现更新会出现问题。

session尽管是单对单的机制,但是该用户很可能看不见其他人刚刚发布的帖子。

下面是一篇php中如何使用session的介绍。

Session [php]

启动会话 — 注册会话 — 使用会话 — 删除会话

1.启动会话

session_start()

通过session_register()函数创建会话

session_register()函数用来为会话登录一个变量来隐含地启动会话,但要求php.ini文件的选项,将register_globals指令设置on,

然后重新启动Apache服务器。

注意:调用session_register()时,不需要调用session_start()函数,PHP会在注册变量后隐含的调用session_start()函数。

2.注册会话

会话启动后,全部保存在$_SESSION中。通过数组$_SESSION创建一个会话变量很容易,只要直接该数组添加元素即可。

<?php

session_start();          //启动session

$_SESSION["admin"] = null;    //生命一个admin的变量,并赋空值

?>

3.使用会话

首先判断会话变量是否有一个会话ID存在,不存在就创建一个,并且使其能通过全局数组$_SESSION 进行访问。如存在,则讲这个会话变量载入以供用户使用。

例如,判断用户名Session会话变量是否为空,不为空则复制给$myvalue,

<?php

if(!empty($_SESSION['session_name']))

  $myvalue = $_SESSION['session_name'];  

?>

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() 之前调用

<?php
$time = 1*60;              //设置Session失效时间
session_set_cookie_params($time);  //使用函数
session_start();             //初始化Session
$_SESSION[username] = 'mr';
?>

说明:不推荐使用此函数,一些浏览器有问题。

(2) 使用Setcookie()

<?php

session_start();

$time = 1*60;                        //给出Session失效时间,1分钟

setcookie(session_name(),session_id(),time()+$time,"/");  //使用setcookie()手动设置Session失效时间

$_SESSION['user']='mr';

?>

2.客户端禁止Cookie

(1)登录之前打开Cookie,很多论坛这么做

(2)通过GET方法,隐藏表单传递session_id  (常用)

(3)使用文件或数据库存储session_id,页面传递中手动调用

======================分===========割============线================

Session高级应用

1.Session临时文件

session_save_path()存储session临时文件,可缓解因临时文件的存储导致服务器效率降低和站点打开缓慢的问题

示例:

<?php
$path = './tmp/'; // 设置session存储路径
session_save_path($path);
session_start(); // 初始化session
$_SESSION[username] = true;
echo "Session文件名称为:sess_" , session_id();
?>

注意: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])

示例:

<?php
session_cache_limiter('private');
$cache_limit = session_cache_limiter();

session_cache_expire(30);
$cache_expire = session_cache_expire();

session_start();
?>

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记录

示例:

<?php

function _session_open($save_path,$session_name)

{

global $handle;

$handle = mysql_connect('localhost','root','root') or die('数据库连接失败');       // 连接MYSQL数据库

mysql_select_db('db_database11',$handle) or die('数据库中没有此库名');               // 找到数据库

return(true);

}

function _session_close()

{

global $handle;

mysql_close($handle);

return(true);

}

function _session_read($key)

{

global $handle;                         // 全局变量$handle 连接数据库

$time = time();                         // 设定当前时间

$sql = "select session_data from tb_session where session_key = '$key' and session_time > $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 < $lapse_time"; // 删除数据库sql语句

$result = mysql_query($sql,$handle);

return($result);

}

session_set_save_handler('_session_open','_session_close','_session_read','_session_write','_session_destroy','_session_gc');

session_start();

$_SESSION['user'] = 'mr';

$_SESSION['pwd'] = 'mrsoft';

?>


转载请注明来自:[MSN Spaces]http://msn.shandian.biz/779.html

  1. 本文目前尚无任何评论.