Last-Modified:16:06:36,May10,2019前言对于小型web服务,session数据基本都存储在本地(多为本地磁盘文件),但是当部署多个服务,需要共享session时,要保证每一个都是服务可以共享相同的会话数据。Redis数据存储在内存中,性能好,持久化保证数据完整性。设计方案1.通过php自带session配置实现#使用redis作为存储方案session.save_handler=redissession.save_path="tcp://127.0.0.1:6379"#如果设置了连接密码,使用下面的session.save_path="tcp://127.0.0.1:6379?auth=password"测试代码";$_SESSION['usertest'.rand(1,5)]=1;var_dump($_SESSION);echo"";输出↓array(2){["usertest1"]=>int(88)["usertest3"]=>int(1)}usertest1|i:1;usertest3|i:1;评估优势:实现简单,无需修改php代码缺点:配置不支持多样化,只能应用于简单场景2.通过session_set_save_handler()函数设置用户自定义session存储函数setsession_set_save_handler(callable$open,callable$close,callable$read,可调用的$write,可调用的$destroy,可调用的$gc[,可调用的$create_sid[,可调用的$validate_sid[,可调用的$update_timestamp]]]):bool#>=php5.4session_set_save_handler(object$sessionhandler[,bool$register_shutdown=TRUE]):bool配置会话存储功能后,再次执行session_start()。具体代码省略,下面提供一份Memcached(来自Symfony框架代码):**有关完整的版权和许可信息,请查看与此源代码一起分发的LICENSE*文件。*/命名空间Symfony\Component\HttpFoundation\Session\Storage\Handler;/***MemcacheSessionHandler。**@authorDrak*/classMemcacheSessionHandlerimplements\SessionHandlerInterface{/***@var\Memcache内存缓存驱动程序。*/私有$内存缓存;/***@varint以秒为单位的生存时间*/private$ttl;/***@varstring共享环境的键前缀。*/私人$prefix;/***构造函数。**可用选项列表:**前缀x:为避免冲突而用于内存缓存键的前缀**expiretime:以秒为单位的生存时间**@param\Memcache$memcacheA\Memcache实例*@paramarray$options内存缓存选项的关联数组**@throws\InvalidArgumentException当传递了不支持的选项时*/publicfunction__construct(\Memcache$memcache,array$options=array()){if($diff=array_diff(array_keys($options),array('prefix','expiretime'))){thrownew\InvalidArgumentException(sprintf('不支持以下选项“%s”',implode(',',$diff)));}$this->memcache=$memcache;$this->ttl=isset($options['expiretime'])?(int)$options['过期时间']:86400;$this->prefix=isset($options['prefix'])?$options['prefix']:'sf2s';}/***{@inheritdoc}*/公共函数打开($savePath,$sessionName){返回真;}/***{@inheritdoc}*/publicfunctionclose(){return$this->memcache->close();}/***{@inheritdoc}*/publicfunctionread($sessionId){return$this->memcache->get($this->prefix.$sessionId)?:'';}/***{@inheritdoc}*/publicfunctionwrite($sessionId,$data){return$this->memcache->set($this->prefix.$sessionId,$data,0,time()+$this->ttl);}/***{@inheritdoc}*/publicfunctiondestroy($sessionId){return$this->memcache->delete($this->prefix.$sessionId);}/***{@inheritdoc}*/publicfunctiongc($maxlifetime){//此处不需要,因为内存缓存无论如何都会自动使记录过期。返回真;}/***返回一个Memcache实例**@return\Memcache*/protectedfunctiongetMemcache(){返回$this->memcache;}}