PHP之負載均衡下的session共用
最近忙於開發台灣運動彩券第四版的程式,所以已經很久沒有上來寫東西了,今天隨便寫點東西和大家分享.
首先說一下負載均衡,相信大家都知道負載均衡可以很好地解決網站大流量的問題,負載均衡就是把用戶的請求分發到多態pc上進行處理,既然分發了請求那麼session就要考慮好處理方法.傳統情況下php會把session存入本機的暫存檔內,可是這種情況下分發了之後session就丟失了,其實最簡單的解決方法就是用memcache來託管,單獨架設一台服務器用來作為memcache服務器(內存最好是大一點),接下來的工作就交給PHP代碼來做就好了,這裡我不想修改php.ini,因為每台都改的話太累,而且我又比較懶
或許您會告訴我說直接修改一下php.ini的session存儲位置就能寫入memcache了,是,沒錯,但是這種方式卻不能調用gc釋放掉過期的會話,而今天我們要說的就是不但要讓他託管,還得讓他自動釋放會話.
既然要做,那就要做到完美才行,下邊是我的代碼,不懂得自己看註釋:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | $_ENV = array ( 'SYS' => array ( 'Memip' => '127.0.0.1' , //MEMCACHE的ip 'Mempt' =>11211, //MEMCACHE的port 'Memtim' =>10, //MEMCACHE的超時時間 ) ); //託管SESSION到MEMCACHE,如果開啟失敗,則說明MEMCACHE沒有配置正確 final class S{ public static function open(){ //禁止session自動開啟 session_write_close(); ini_set ( 'session.auto_start' ,0); //使用五十分之一的概率啟動gc清理會話 ini_set ( 'session.gc_probability' ,1); ini_set ( 'session.gc_divisor' ,50); ini_set ( 'session.use_cookies' ,1); //session的壽命 //ini_set('session.gc_maxlifetime',$_ENV['SYS']['Memtim']); //ini_set('session.cookie_lifetime',$_ENV['SYS']['Memtim']); //ini_set('session.save_handler','files'); //ini_set('session.save_path',Run.'_tmp'); //ini_set('session.save_handler','memcache'); //ini_set('session.save_path','tcp://127.0.0.1:11211'); //$_ENV['S_tim'] = ini_get('session.gc_maxlifetime'); //建立memcache對象 $_ENV [ 'S_mem' ]= new Memcache; $_ENV [ 'S_mem' ]->connect( $_ENV [ 'SYS' ][ 'Memip' ], $_ENV [ 'SYS' ][ 'Mempt' ]) or die ( 'Memcache連接失敗!' ); return TRUE; } /** 讀取 返回:讀到的內容 /**/ public static function read( $id ){ return $_ENV [ 'S_mem' ]->get( 's_' . $id ); } /** 寫入 返回:bool /**/ public static function write( $id , $data ){ return $_ENV [ 'S_mem' ]->set( 's_' . $id , $data ,MEMCACHE_COMPRESSED, $_ENV [ 'SYS' ][ 'Memtim' ]); } /** 關閉 返回:bool /**/ public static function close(){ $_ENV [ 'S_mem' ]->close(); unset( $_ENV [ 'S_mem' ], $_ENV [ 'SYS' ][ 'Memtim' ]); return TRUE; } /** 刪除 返回:bool /**/ public static function destroy( $id ){ return $_ENV [ 'S_mem' ]-> delete ( 's_' . $id ); } /** 清理 返回:bool /**/ public static function gc(){ return TRUE; } } session_set_save_handler( 'S::open' , 'S::close' , 'S::read' , 'S::write' , 'S::destroy' , 'S::gc' ); $_ENV [ 'sessionid' ]=(isset( $_REQUEST [ 'sessionid' ])) ? trim( $_REQUEST [ "sessionid" ]) : session_id(); if ( $_ENV [ 'sessionid' ]!= '' ){session_id( $_ENV [ 'sessionid' ]);} session_start(); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库