当前位置: 首页 > 后端技术 > PHP

会话共享技术设计

时间:2023-03-30 03:22:08 PHP

概述分布式会话是分布式部署的前提。由于历史原因,当前项目没有实现分布式会话。但是在kubernets中部署多个pod时,负载均衡调用链过长,导致session无法维护,因此迫切需要分布式session。实施计划A.修改配置文件php.ini直接在PHP中配置,或者在代码中集成session.save_handler=redissession.save_path="tcp://127.0.0.1:6379"b.动态设置ini_set("session.save_handler","redis");ini_set("session.save_path","tcp://127.0.0.1:6379");C。实现SessionHandlerInterface接口PHP提供了SessionHandlerInterface接口,implement根据该接口实现,即可完成session共享。/***@seehttp://php.net/manual/zh/class.sessionhandlerinterface.php*/SessionHandlerInterface{abstractpublicboolclose(void)abstractpublicbooldestroy(string$session_id)abstractpublicintgc(int$maxlifetime)abstractpublicboolopen(string$save_path,string$session_name)abstractpublicstringread(string$session_id)abstractpublicboolwrite(string$session_id,string$session_data)}/***@seehttp://php.php。net/manual/zh/class.sessionhandler.php*/MySessionHandler实现SessionHandlerInterface,SessionIdInterface{publicboolclose(void)publicstringcreate_sid(void)publicbooldestroy(string$session_id)publicintgc(int$maxlifetime)publicboolopen(string$save_path,string$session_name)publicstringread(string$session_id)publicboolwrite(string$session_id,string$session_data)}以上是PHP文档中对这个接口的描述,下面是快速概览涉及的几种方法:方法描述opn方法用于基于文件的会话存储系统。这个方法里面不能放代码,可以设置为空。方法close和open方法一样,也可以忽略。大多数驱动程序不使用此方法。read应返回与给定$sessionId匹配的会话数据的字符串版本。write应该将给定的$data写入持久存储系统的相应$sessionId。destroy从持久存储中删除对应于$sessionId的数据。gc方法销毁所有大于给定$lifetime的会话数据。对于有自己过期机制的系统,比如Memcached、Redis,这个方法可以留空。实现完成后,使用session_set_save_handler完成sessiondriver的注册$handler=newMySessionHandler();session_set_save_handler($handler,true);//下面这行代码可以防止使用an时可能导致的意外行为作为会话保存管理器的对象register_shutdown_function('session_write_close');session_start();//现在可以使用$_SESSION来保存和获取数据警告:脚本执行后,PHP内部会清除该对象,因此write和close回调函数可能不会被调用,这可能会导致意外行为,所以在使用对象作为sessionsavemanager时,需要通过注册一个shutdown回调函数来规避风险。通常,可以通过调用register_shutdown_function()函数来注册session_write_close()回调函数。自定义session驱动可以通过memcached、redis、db等实现分布式session,考虑先实现redissession驱动