php session

配置session

在php.ini中和session有关的常用配置选项如下:

  • session.save_path:保存session数据的路径

  • session.name: 设置session的标识名,用在客户端Cookie里的session标识名。(php.ini里是这样: session.name=PHPSESSID)

  • seesion.use_cookies: 是否使用Cookie在客户端保存sessionID,1表示允许。

  • seesion.cookie_lifetime: cookie中的sessionID在客户机上保存的有效期,0表示延续到浏览器关闭时。

  • session.gc_probability和session.gc_divisor:定义在每次初始化会话时,启动垃圾回收机制的概率,这个收集的概率计算公式:session.gc_probability / session.gc_divisor

  • session.gc_maxlifetime:超过此参数设定的秒数后,保存的数据将被视为垃圾并由垃圾机制回收。

  • session.save_handler:设置保存session数据的机制,默认是file,如需要基于数据库或者memcache的话,可以设置为user.

与session操作相关的过程

开始会话

使用 bool session_start(void)开始一个会话,在用此函数开启一个会话之前不能有任何的输出。第一次调用该函数时,会创建一个唯一的sessionID,并自动设置在http头域的cookie中,同时会在服务器端以这个sessionID创建一个xxx_sessionID命名的文件,用于保存这个会话的信息。当同一个用户在访问网址时会在http头域携带这个sessionID,这时session_start()函数不再创建ID,而是拿到客户端带来的sessionID去寻找xxx_sessionID文件,读取里面的内容,以此来达到跟踪用户的目的。

注册会话变量

在php脚本中访问session需要通过$_SESSION数组来完成,$_SESSION数组必须在session_start()开启后才能启用。给$_SESSION数组赋值就是一个注册变量的过程。当给$_SESSION赋值的同时(如:$_SESSION['name']='jack'),也会自动将信息追加到xxx_sessionID文件中。

注销会话变量与销毁session

当使用完一个seesion变量后,可以将其删除;完成一个会话后,也可以将其删除。删除一个session变量可以使用 unset($_SESSION['name']),这样会把指定的session变量删除,同时也把xxx_sessionID文件里的对应信息删除。使用$_SESSION=array()可以删除当前$_SESSION数组的所有变量,对应文件的内容也将全部清除。如果使用unset($_SESSION)的话,后面将不能在使用$_SESSION数组。
如果需要销毁会话可以使用session_destroy()函数,该函数会销毁当前用户的session,并把xxx_sessionID文件删除,但是该函数不会释放之前session注册的变量,也不会删除保存在客户端的sessionID,所以在销毁之前先把sessionID从客户端中清除,可以使用setCookie()函数来完成,可以设置如下:

setCookie(session_name(), "", time()-3600) //设置过期

所以总的来说session的启动到销毁总共需要四个过程:

//开启session
session_start();
//删除所有session变量
$_SESSION=array();
//删除cookie里的sessionID
if(isset($_COOKIE[session_name()])) {
    setcookie(session_name(),'',time()-3600)
}
//最后销毁session
session_destroy();

会话自动回收

日常中我们登陆网站时,网站都有会一个退出登陆的操作,如果点击退出登陆,就是一个与服务端销毁session的过程。但是如果直接关闭窗口,或者断电等情况呢,服务端的session怎么销毁?一般我们会在php.ini文件里设置session.cookie_life=0来设定cookie里的sessionID的有效期为关闭窗口。我们还可以给session设置一个有效期,需要在php.ini文件中设置session.gc_maxlifetime选项,不管浏览器是否开启,只要时间过期,自动回收垃圾机制启动后就会把过期的session清除。那么自动回收机制什么时候开启呢?
一般当调用session_start()函数时就会启动垃圾回收机制。但是一个网站是有多个脚本,每个脚本都使用session_start(),而且网站又是有很多用户访问,所以每次调用session_start()就启动垃圾回收机制是不合理的。这时候需要在php.ini里设置session.gc_probability和session.gc_divisor选项,这两个选项是设置了垃圾回收机制的启动概率,比如设置session.gc_probability=1,session.gc_divisor=100,就是session_start()调用100次,垃圾回收机制启动一次。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352

推荐阅读更多精彩内容