PHP之session机制和优化

栏目: PHP · 发布时间: 6年前

内容简介:PHP之session机制和优化

本文说一说 PHP 中的Session机制和优化的话题。

默认情况下,我们是直接使用$_SESSION来操作会话,并且以文件的形式保存,一个会话对应一个文件。如果单个目录下存储太多会话文件影响读取效率,可以通过配置多级目录存储。默认使用文件保存会话,存在单机情况,不能部署应用群集的方式来扩展PHP应用。但是使用memcache和 redis 等扩展,通过配置可以直接把会话保存到memcache和redis中,并且不需要改变之前的使用方式,直接使用$_SESSION,这样能方便地扩展集群,并且简单高效。

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

进一步探究,PHP提供了一套机制:session_set_save_handler注册回调方法和实现SessionHandlerInterface接口(5.4版本后支持),这两者使用差别不是很多,随意选择,都要实现open, read, close,write,gc,destroy这几个方法。当session_start()时,调用open和read方法,把会话读取到$_SESSION变量中,用户就可以在当前请求中,存取$_SESSION变量。在程序执行完后,在输出流结束以后,在有 register_shutdown_function() 方法执行以后,执行write和close方法,将会话内容写回到存储系统。这样我们就可以自定义把会话保存到数据库中,或者保存到memcache/redis等缓存系统中。

根据上面PHP会话机制的了解,有如下主要实践,也是优化方案:

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

2. 不要直接使用$_SESSION变量,而是封成方法,比如sget/sset/sdel来获取/保存/删除会话内容,因为直接使用$_SESSION无法进一步控制或优化。

3. 实际上网站在使用会话时,大部分都是读取操作,而不会修改会话内容,因此可采取只读而不回写策略,能减少一次网络操作。需要结合第2点,当会话操作时,维护一个变量$isChange,读会话时不需要设置$isChange,设置或删除会话时$isChange=true;当PHP执行session方法write时,对$isChange进行判断,有变更时进行写回,没有变更时,直接返回。

进一步的考虑是,把session的内容保存到cookie中,并进行加密。这样的好处是,不需要为session消耗太多服务器资源,坏处是,增加稍许的网络流量,总得来说值得使用。cookie尽量不要保存太多数据,可结合数据库或缓存系统,比如只把登录所需要的用户角色权限相关数据作为会话保存到cookie中,而与购物车,其它临时数据等存到缓存。

session数据的编码解码,简单地可使用serialize/unserialize/json_encode/json_decode进行编码解码。而加解密按需选取一个加密算法即可。

使用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目录:https://github.com/frogluo/php/


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

数据结构与算法

数据结构与算法

[美] 乔兹德克 (Drozdek, A. ) / 郑岩、战晓苏 / 清华大学出版社 / 2006-1 / 69.00元

《国外计算机科学经典教材·数据结构与算法:C++版(第3版)》全面系统地介绍了计算机科学教育中的一个重要组成部分——数据结构,并以C++语言实现相关的算法。书中主要强调了数据结构和算法之间的联系,使用面向对象的方法介绍数据结构,其内容包括算法的复杂度分析、链表、栈队列、递归技术、二叉树、图、排序以及散列。《国外计算机科学经典教材·数据结构与算法:C++版(第3版)》还清晰地阐述了同类教材中较少提到......一起来看看 《数据结构与算法》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换