自定义Session处理方式
1、在系统中使用Session技术跟踪用户是,Session默认的处理方式是使用Web服务器中的文件来记录每个用户的会话信息,通过php.ini中的session_save_path创建会话数据文件的路径。这种默认的处理方式虽然很方便,但也有一些缺陷。例如,登录用户如果非常大,文件操作的I/O开销就会很大,会严重影响系统的执行效率。另外,最主要的是本身的session机制不能跨机,因为对象鱼访问量比较大的系统,通常都是采用多台web服务器进行并发处理,如果每台web服务器都各自独立地处理啊Session,就不可能达到跟踪用户的目的。这时就需要我们来改变session的处理方式,常见的跨机方法就是通过自己定义session的存储方式,可以将session信息使用NFS或SAMBA等共享技术保存到其他服务器中,或使用数据库来保存session信息,最优的方式是使用memcached来进行session存储。自定义session的存储机制无论是用memcached、数据库、还是通过NFS或SAMBA共享session信息,其原理是一样的,都是通过PHP中的session_set_save_handler()函数来改变默认的处理方式,指定回调函数来自定义处理。该函数的原型如下:Session_set_save_hander(callback open,callback close,call read,callback write,callback destro,callback gc);该函数供需要6个回调函数作为必选参数,分别代表了Session声明周期中的6个过程,用户通过自定义每个函数,来设置Session生命周期中每个环节的信息处理。回调函数的执行时机
2、在运行session_start(0时分别执行了open(启动会话)、read(读金泫险缋取session数据至$_S呶蓟鹭毵ESSION)和gc(清理垃圾),脚本中所有对$_SESSION的操作均不会调用这些回调函数。在调用session_destroy函数时,执行destroy销毁当前session(一般是删除相应的记录或文件),但此回调函数销毁的只是Session的数据,此时如果输出$_SESSION变量,仍然有值得,但此值不会再 close后被写回去爱。在调用时session_write_close()函数时执行write和close,保存$_SESSION至存储,如果不手工使用此方法,则会在脚本结束时被自动执行注意:session_set_save_hander()函数必须在php.ini中设置session_save_hander选项的值为”user”时(用户自定义处理器),才会被系统调用。下例通过自定义的处理方式,将Session信息写入到文件中。首先将php.ini中的session.save_hander选项值改为”user”,或使用ini_set()函数在当前脚本中临时改变Session的处理方式为”user”<?php $sess_save_path =””; Function open($save_path,$session_name){ Global $sess_save_path;$sess_save_path = $save_path;Return true;}Function close(){Return true;}Function read($id){Global $sess_save_path;$sess_file =”{$sess_save_path}/sess_{$id}”;Return (string) @file_get_contents($sess_file);}Function write($id,$sess_data){Global $sess_save_path;$sess_file =”{$sess_save_path}/sess_{$id}”;If($fp=@fopen($sess_file,”w”)){ $return = fwrite($fp,$sess_data);Fclose($fp);Return $return;}else{ Return false;}}Function destroy($id){Global $sess_save_path;$sess_file =”{$sess_save_path}/sess_{$id}”;Return (@unlink($sess_file));}Function gc($maxlifetime){ Global $sess_save_path;Foreach(glob(“{$sess_save_path}/sess_*”) as $filename){ If(filemtime($filename)+$maxlifetime<time()){ @unlink($filename);}}Return true;}Session_set_save_hander(“open”,”close”,”read”,”write”,”destroy”,”gc”);Session_start();