自定义Session处理方式

2025-11-07 16:55:25

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生命周期中每个环节的信息处理。回调函数的执行时机

自定义Session处理方式

2、在运行session_start(0时分别执行了open(启动会话)、read(读取session数据至$_SESSION)和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();

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢