PHP之session机制和优化

  PHP Session的启动,可以配置为是否自动启动,是的话,每个请求一开始,就可以直接使用_SESSION里的内容已经(从文件 、memcache、redis中)取出来了;如果否,程序中则要调用session_start来启动。想要更多的控制权,就不要自动启动,比如一些页面不需要会话的,就不应启动会话(因为启动了又不用,还要浪费会话读取的功夫)。

  1. 把会放的启动控制放到控制器(基类控制器、子类控制器、甚至控制器中的方法),让控制器决定是否使用会线. 不要直接使用

  SESSION变量,而是封成方法,比如sget/sset/sdel来获取/保存/删除会话内容,因为直接使用S E S S I O N 变 量 , 而 是 封 成 方 法 , 比 如 s g e t / s s e t / s d e l 来 获 取 / 保 存 / 删 除 会 话 内 容 , 因 为 直 接 使 用_SESSION无法进一步控制或优化。3. 实际上网站在使用会话时,大部分都是读取操作,而不会修改会话内容,因此可采取只读而不回写策略,能减少一次网络操作。需要结合第2点,当会话操作时,维护一个变量

  isChange,读会话时不需要设置i s C h a n g e , 读 会 话 时 不 需 要 设 置isChange,设置或删除会话时isChange=true;当PHP执行session方法write时,对i s C h a n g e = t r u e ; 当 P H P 执 行 s e s s i o n 方 法 w r i t e 时 , 对isChange进行判断,有变更时进行写回,没有变更时,直接返回。进一步的考虑是,把session的内容保存到cookie中,并进行加密。这样的好处是,不需要为session消耗太多服务器资源,坏处是,增加稍许的网络流量,总得来说值得使用。cookie尽量不要保存太多数据,可结合数据库或缓存系统,比如只把登录所需要的用户角色权限相关数据作为会话保存到cookie中,而与购物车,其它临时数据等存到缓存。

  使用cookie会话一般都要 ob_start()开始输出缓冲区, 注意不要在在关闭缓冲区或输出流关闭后再设置cookie,或者输出内容后再设置 cookie, 否则会报: Cannot modify header information - headers already sent 。如果是在程序结束后,再调用session的write方法设置cookie,在遇到输出图形校验码或比较大的文件内容等情况会出错。一种解决方法在设置会话时立即输出header,然后再输出其它内容,而不是等到执行会话的write方法时再输出cookie的header信息。

  如果把session放到cookie中,会增大header头部数据量,通过nginx等反向代理转发时,可能需要调整转发的buffer.

  根据以上的机制和思路,简单实现了关于会话的封装,可参考github中的session目录:

  abc15689892免费领取,由于领取的朋友较多,加微信的时候一定要备注:999

相关阅读