HTTP 协议是无状态的,客户端与服务器的每一次交互都是独立的,要保持用户的会话状态,让服务器知道这次请求是谁发起的,就需要 session 或者其他类似方式来控制。session 通过 cookie 存储在客户端,客户端每次向服务器请求都会带上 session_id 来向服务器告知当前的请求是哪个用户发起的。
php.ini 中的 session.save_hanlder 是用来配置 session 存储方式的。 session.save_hanlder 有4个值可选,files (默认值,存储在文件中)、mm(共享内存,需要下载mm库)、sqlite(轻量级数据库)、user(用户自定义会话处理机制)。
PHP 的 session 默认存储在文件中 session.save_hanlder=files,存储位置可以在 php.ini 中的 session.save_path 配置参数中查看,如果你的用户数量较多,高并发下文件的读写会拖慢整个程序的执行效率。如果是多台服务器的话,就需要配置网络共享文件夹来允许各个服务器访问,其中的安全机制和权限问题可是一个大工程。
当下主流的 session 存储机制,是使用 db 或者 redis 的方式处理会话。个人倾向于后者,使用 redis ,因为 redis 存取数据的速度比 db 快,单台 redis 服务器号称可以抗10W并发,且后期支持集群。使用 db 存储也是一种方案,但是 session 需要频繁的读取,每次 http 请求都需要读取一次,对数据库的读写压力比较大。
session 的存储方案还有不少,主要看业务需求,如果对数据保密要求不高的,甚至可以直接存在 cookie ,只不过每次请求都需要占用带宽,且大小受cookie限制。
领取专属 10元无门槛券
私享最新 技术干货