• [php session]


    在此论坛上有很多关于session的问题.我现在将自己的一些理解和曾经碰到的问题总结一下,
    希望对session 有困惑的朋友跟贴,一起探讨,尽量将困惑降到最低.

    简单介绍:
    ------------------------------------------------------------------------------
    session的内容是存储的在服务器上,安全性能比较好,不容易被盗看,但是
    如果 session的量太大的时候,会占太多的服务器空间。

    cookie是存储在客户端上的,不会耗费服务器资源,但是安全性会差一点,
    而且使用 cookie会依赖于客户端的设置。

    cookie不会依赖于session,session会利用cookie 来工作,但不会依赖
    于cookie。(换句话,session 在离开cookie的时候,也可以工作。)

    session 的工作方式:
    -------------------------------------------------------------------------------
    session 的工作流程, 初始化session -> 注册或使用session变量。

    1,初始化session (三种方法)
    a, session.auto_start = 1 利用脚本配置参数。 此参数可以通过php.ini 来设置
    也可以在脚本上利用ini_set() 来设置。
    b, session start()
    c,session_register()

    这个时候php的session管理模块将会检查是请求中否有sessionID传送过来,如果有的
    话原先的session 存储将会被更新(个人认为:更新的动作仅仅是将存储session
    文件的lifetime进行了更新,更新到当前时间)。如果没有,php的session管理模块产
    生一个新的sessionID。这个sessionID一般来说是唯一的,重复的可能性极小,而且
    经过md5加密。你可以使用session_id() 函数来取得当前的sessionID。

    2,注册或使用session变量了。
    如果注册成果的话session管理模块将会把session变量的内容存储到服务器上指定的
    位置(当然你也可以使用中自己的方式去存储,比如数据库等)
    系统默认的情况下会以文件的形式存储在指定的目录下,文件名为"sess_" 加sessionID
    文件内容为:变量名|类型:长度:"内容" ,如果多个变量就使用分号分隔。
    这个时候session管理模块将会把sessionID同过cookie的方式存储到客户端(默认方式)。
    你可以设置这个特殊的cookie名称,默认为"PHPSESSID";
    cookie默认的生命周期是浏览器的生命周期,一旦浏览器关闭这个cookie也会随之失效。
    你还可以为这个特殊的cookie定制一些特殊的属性。

    但是如果客户端拒绝接受cookie 话,session管理模块会把sessionID跟在url后面。以保证
    session的正常工作,但是他会有一些缺陷,下面将会介绍。
    注意一定要检查以下的参数,才能保证上面这个动作的执行:
    session.use_cookies = 1
    session.use_only_cookies = 0
    session.use_trans_sid = 1

    关于session的垃圾收集:
    ---------------------------------------------------------------------------------
    为什么需要垃圾收集?
    如果用户正常退出的时候,我们可以利用程序调用session注销函数将相应的在服务器存储的
    session文件进行删除。但是如果我们的程序不是很严密或者用户是在会话的过程中突然将浏
    览器关闭的话,这个时候就会产生一些session文件将会永远的存储在服务器上,而且不在会
    被利用。如果不进行垃圾收集的话,这些内容将会越来越多。



    session管理模块是如何进行垃圾回收的?

    对于session管理模块来说,如果没有明确的接收到回收指令,他会把所有的session文件都认为
    是有效的。因为session管理模块不知道用户是关闭了浏览器还是仅仅只是离开了一会儿。
    这个时候session管理模块是这样处理的:
    它把24分钟内(默认设置)没有被更新的session文件当作垃圾文件,并且做上标记。
    session有相关的时间设置,如果超过24分钟(默认)session管理模块将会把这个session文件
    标志为垃圾文件。然后通过事件触发,进行回收,你可以设定回收的概率(默认1%),个人认为
    session管理模块垃圾收集的触发在初始化的时候。

    如果你有兴趣的话,可以做这样一个实验:
    将session管理模块的垃圾收集概率设置为100%,垃圾文件标识时间设置为0;


    session参数设置:
    -----------------------------------------
    [Session]
    session.save_handler = files
    ;存储和找回session的处理方式,默认是files 你也可以使用session_set_save_handler()去设置用户级别的
    ;session存储和找回处理方式。有兴趣的话可以去查手册,上面有一个很好的例子。

    session.save_path = C:/temp
    ;session文件的存储位置,你也可以使用session_set_save_handler()去设置用户级别的
    ;session存储位置,文件、数据库都可以!

    session.use_cookies = 1
    ;是否利用cookie传递sessionID

    ; session.use_only_cookies = 1
    ;是否仅仅利用cookie传递sessionID(sessionID有两种传递方式cookie,url)

    session.name = PHPSESSID
    ;传递sessionID的cookie名称

    session.auto_start = 0
    ;是否在每次请求的时候自动初始化session

    session.cookie_lifetime = 0
    ;传递sessionID的cookie的生存周期

    session.cookie_path = /
    ;传递sessionID的cookie的有效位置,如果是"/"的话表示在整个网站下有效

    session.cookie_domain =
    ;传递sessionID的cookie的有效域,如果想在父域下所有子域内有效,填写" .domainName.com"

    session.serialize_handler = php
    ;session 序列化的处理方式

    session.gc_probability = 1
    session.gc_divisor = 100
    ;垃圾session文件的回收概率 = session.gc_probability/session.gc_divisor

    session.gc_maxlifetime = 1440
    ;session文件被标志为垃圾文件的时间


    session.bug_compat_42 = 1
    session.bug_compat_warn = 1
    ;php 在<= 4.2 版本的时候,如果 register_globals 关闭 ,
    ;还是允许你去初始化一个全局范围的变量,但是在php 在>= 4.3 版本里,如果将上面的
    ;两个参数打开系统将会给出warn信息.


    session.referer_check =
    ;此参数是一个字符串,系统将会检查此串是否存在于来自客户端的referer中,如果否的话
    url中内含的sessionID,将会被看作无效。主要防止客户端发送伪装的带sessionID的假请求

    ;session.entropy_length = 16
    ;session.entropy_file = /dev/urandom
    ;session的创建来源,在unix系统中 你可以使用/dev/random or /dev/urandom。


    session.cache_limiter = nocache
    ;此参数将会影响到http的caching(即网页是不是被缓存)你可以选择三个参数
    ;nocache,private,public,如果为空的话,则是nocache


    session.cache_expire = 180
    ;此参数将会影响到http的caching(即网页是不是被缓存),此为缓存时间,单位为分。

    session.use_trans_sid = 0
    ;将sessionID利用URL传递。

    url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=,fieldset="
    ;在使用URL传递sessionID的时候,自动在页面的指定标签的url内容添加sessionID。


    cookie拒绝使用给session带来的问题
    -------------------------------------------------------------------
    当客户端的cookie拒绝使用的情况下。将会带来很多的一些的不方便:
    php 会自动在页面的链接和表单等地方添加sessionId参数。以保证会话的
    继续,但是这个时候,在一个浏览器上多次手工输入一样地址,session
    会认作为多次会话而不是一次。

    常见的session问题:
    -------------------------------------------------------------------
    1,如何设置长生命期的session ?
    将 session.cookie_lifetime ,session.gc_maxlifetime 的时间设置长一点。


    2,为什么初始化session的时候报错?
    a,检查session文件的存储路径,路径是否对,操作权限是否够
    b,检查session初始化之前是否有html 内容输出

    3,客户端在禁止使用cookie的时候,session会有影响吗?
    当客户端的cookie拒绝使用的情况下。将会带来很多的一些的不方便:
    php 会自动在页面的链接和表单等地方添加sessionId参数。以保证会话的
    继续,但是这个时候,在一个浏览器上多次手工输入一样地址,session
    会认作为多次会话而不是一次。

    4,为什么我的session 过几分钟就失效了?
    1,检查浏览器的cookie 是否启用,如果没有启用的话检查
    系统是否允许使用url传递sessionID,最后检查url_rewriter.tags设置
    2,检查session的垃圾标识时间,和回收概率

    5,如何将我的session 存储在数据库内?
    利用session_set_save_handler("open", "close", "read", "write", "destroy", "gc")
    定制自己的处理方式。

    6,如何利用session 得到当前的用户数量和列表?
    如果将session存储在数据库内,就会很容易实现,但是不管用什么
    方式得到的数据不一定是精确数据。

    7,为什么我填写的表单在后退之后内容就不见了?
    检查脚本内有没有初始化session的动作,如果有的话,使用:
    session_cache_limiter('private, must-revalidate');

    6,如何利用session来控制网页的缓存?
    调整session.cache_limiter ,session.cache_expire

    8,我用session管理会话,如果同一个帐户在两台机器上同时登陆会有影响吗?
    不会有影响。因为这是两个sessionID.也就是说服务器上有两个session文件
    来保证各自的会话。

    困难是老天给我们提高的机会,坚定不移勇敢地去攻克,不要退缩,加油!
  • 相关阅读:
    水晶报表开发
    ASP.NET页面刷新方法总结
    DataList获取当前ID
    flexviewer让指定slid值对于的图层可见
    WKT
    消息的分类
    MFC画图
    MFC画文字DrawText,GetTextExtent,GetTextMetrics
    djvu是什么
    代码提示插件 Visual Assistxv
  • 原文地址:https://www.cnblogs.com/merlini/p/3142300.html
Copyright © 2020-2023  润新知