默认情况下,session是存储在文件中的,每个用户请求过来都会对session文件进行读写,系统对文件的读写消耗比较大,效率也低下,所以在开发过程中一般是不选择文件作为存储session的方式?
php支持用户指定的存储方式,一般是存储在数据库或者是memcache中,如果需要指定存储方式需要在php.ini里设置:
session.save_handler="user" //user表示支持用户自定义设置。
其实自定义设置和默认设置的操作过程是一样的,只不过是操作对象不同而已,比如默认是操作文件,自定义改为操作数据库。除此之外,默认的处理行为也由系统自动处理改为开发人员自定义方式处理。
php提供了session_set_save_handler()函数来改变默认的处理方式,也就是说session生命周期的几个过程都讲由该函数来实现。
session_set_save_handler(open,close,read,write,destroy,gc)函数接受六个回调函数,代表着session的六个过程。
- open($save_path,$session_name)
该函数接受两个参数,系统会自动把php.ini里的session.ave_path传给第一个参数,把session.name传给第二个参数。该函数返回true可以继续向下执行。该函数时在调用session_start()是自动触发回调执行。 - close()
该函数没有参数,是在调用session_destroy()或者session_write_close()时被回调执行,做一些sesion被销毁后的工作,如果什么也没有做,就直接返回true. - read
read($session_ID)
该函数只有一个参数,是sessionID,该函数是在客户端在cookie里携带sessionID后在,在session_start()调用是被回调执行,负责从自定义的数据结构里读取数据放在$_SESSION里,返回当前用户的会话信息写在$_SESSION变量。 - write($sessionID, $session_data)
该函数接受两个参数,第一个参数是sessonID,第二个参数是串行化后的session信息。该函数在脚本执行完或者是对$_SESSION赋值是被执行,该函数通过参数sessionID找到对应的session数据结构,把session_data写进去。 - gc($maxlifttime)
该函数在垃圾回收机制启动时被执行,需要一个参数,系统自动将php.ini里的session.gc_malifttime的值传给该函数,用于删除超过这个时间的sessionx信息,返回true可以继续向下执行。
至此自定义的session存储的几个过程就结束了。