真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何運(yùn)用PHP+REDIS解決負(fù)載均衡后的session共享

一、為什么要使用Session共享?

稍大一些的網(wǎng)站,通常都會有好幾個服務(wù)器,每個服務(wù)器運(yùn)行著不同功能的模塊,使用不同的二級域名,而一個整體性強(qiáng)的網(wǎng)站,用戶系統(tǒng)是統(tǒng)一的,即一套用戶名、密碼在整個網(wǎng)站的各個模塊中都是可以登錄使用的。各個服務(wù)器共享用戶數(shù)據(jù)是比較容易實(shí)現(xiàn)的,只需要在后端放個數(shù)據(jù)庫服務(wù)器,各個服務(wù)器通過統(tǒng)一接口對用戶數(shù)據(jù)進(jìn)行訪問即可。但還存在一個問題,就是用戶在這個服務(wù)器登錄之后,進(jìn)入另一個服務(wù)器的別的模塊時,仍然需要重新登錄,這就是一次登錄,全部通行的問題,映射到技術(shù)上,其實(shí)就是各個服務(wù)器之間如何實(shí)現(xiàn)共享 SESSION 數(shù)據(jù)的問題。

創(chuàng)新互聯(lián)公司,是成都地區(qū)的互聯(lián)網(wǎng)解決方案提供商,用心服務(wù)為企業(yè)提供網(wǎng)站建設(shè)、重慶APP開發(fā)、成都微信小程序、系統(tǒng)按需定制和微信代運(yùn)營服務(wù)。經(jīng)過數(shù)十余年的沉淀與積累,沉淀的是技術(shù)和服務(wù),讓客戶少走彎路,踏實(shí)做事,誠實(shí)做人,用情服務(wù),致力做一個負(fù)責(zé)任、受尊敬的企業(yè)。對客戶負(fù)責(zé),就是對自己負(fù)責(zé),對企業(yè)負(fù)責(zé)。

二、了解session工作原理

在解決問題之前,先來了解一下 PHP SESSION 的工作原理。在客戶端(如瀏覽器)登錄網(wǎng)站時,被訪問的 PHP 頁面可以使用 session_start() 打開 SESSION,這樣就會產(chǎn)生客戶端的唯一標(biāo)識 SESSION ID(此 ID 可通過函數(shù) session_id() 獲取/設(shè)置)。SESSION ID 可以通過兩種方式保留在客戶端,使得請求不同的頁面時,PHP 程序可以獲知客戶端的 SESSION ID;一種是將 SESSION ID 自動加入到 GET 的 URL 中,或者 POST 的表單中,默認(rèn)情況下,變量名為 PHPSESSID;另一種是通過 COOKIE,將 SESSION ID 保存在 COOKIE 中,默認(rèn)情況下,這個 COOKIE 的名字為 PHPSESSID。這里我們主要以 COOKIE 方式進(jìn)行說明,因?yàn)閼?yīng)用比較廣泛。

服務(wù)端通過客戶端傳遞的session_id區(qū)分用戶,用來標(biāo)記用戶的登錄狀態(tài)。

如何運(yùn)用PHP+REDIS解決負(fù)載均衡后的session共享

用戶再次發(fā)送請求的時候,把服務(wù)端返回的session_id通過cookie[或者URL傳參]的形式傳遞到服務(wù)端,這樣服務(wù)端就可以區(qū)分出來具體操作的用戶。

三、如何解決負(fù)載均衡之后的session共享問題?

1.不使用session,換作cookie

把session改成cookie,就能避開session的一些弊端?!景踩暂^低】

2.?dāng)?shù)據(jù)庫記錄下session信息

使用數(shù)據(jù)庫記錄session信息,session的使用頻率比較高,如果存在數(shù)據(jù)庫中,頻繁的讀取會對數(shù)據(jù)庫產(chǎn)生較大的壓力,網(wǎng)站性能瓶頸一般都存在數(shù)據(jù)庫.

3.負(fù)載均衡的時候使用ip_hash算法進(jìn)行分發(fā)

使用ip_hash可能會導(dǎo)致某一臺服務(wù)器負(fù)載較大。如果某段時間內(nèi)服務(wù)器進(jìn)入了很多固定IP代理的請求 [代理] ,如果代理IP的負(fù)載過高就會導(dǎo)致ip_hash對應(yīng)的服務(wù)器負(fù)載壓力過大,這樣ip_hash就失去了負(fù)載均衡的作用了。

4.對session文件進(jìn)行同步

使用同步工具對session文件進(jìn)行同步,保證負(fù)載服務(wù)器的session文件都是一致的,這種做法雖然可以解決session共享的問題,同樣的內(nèi)容會存在多個服務(wù)器上,而且部分服務(wù)器存在的session文件可能從開始到結(jié)束完全沒有使用到,浪費(fèi)了服務(wù)器的資源。 【rsync,inotify-tools等】

5.使用memcache或者redis保存session信息 [建議]

相比文件取信息,從內(nèi)存取數(shù)據(jù)速度要快很多,而且在多個服務(wù)器需要共用 session 時會比較方便,將這些服務(wù)器都配置成使用同一組 memcached 服務(wù)器就可以,減少了額外的工作量。其缺點(diǎn)是 session 數(shù)據(jù)都保存在 memory 中,一旦宕機(jī),數(shù)據(jù)將會丟失。但對 session 數(shù)據(jù)來說并不是嚴(yán)重的問題。

四、PHP+REDIS解決session共享問題

1、session默認(rèn)存儲是php.ini中配置的

//session存儲方式
session.save_handler = files  

//session保存路徑  N表示按照分級存儲
session.save_path = "N;/path"

注:session.save_path = "2;/data/session_tmp"代表將session文件分成兩級存放,即/data/session_tmp/4/b /sess_4b1e384ad74619bd212e236e52a5a174If,取前兩位字符,但是php并不生成目錄,需要自己手工生成。

//session保存的目錄
session.save_path = "d:/wamp/tmp"    php自帶函數(shù)session_save_path
//是否自動開啟session
session.auto_start = 0

2、設(shè)置session保存方式為redis

(1) 修改完成之后重啟php-fpm,nginx改php.ini配置文件

session.save_handler = redis
        session.save_path = “tcp://127.0.0.1:6379″

(2) 通過ini_set設(shè)置

ini_set(“session.save_handler”,”redis”);
        ini_set(“session.save_path”,”tcp://127.0.0.1:6379″);

有密碼設(shè)置

  ini_set(“session.save_path”,”tcp://127.0.0.1:6379?auth=redisauthkey″);

(3) 具體實(shí)現(xiàn)

';
        $redis = new redis();       
         $redis->connect('127.0.0.1', 6379);       
          $redis->auth( ‘redisauthkey’ );
//redis用session_id作為key并且是以string的形式存儲        
echo $redis->get('PHPREDIS_SESSION:' . session_id());  
?>

3、通過session_id建立自己的一套session機(jī)制

借助session_id建議一套自己的機(jī)制,原理可以參考session保存機(jī)制。

  • 用戶第一次請求時候,給用戶下發(fā)session_id。

  • 之后請求都要帶上session

  • 用戶登錄之后把用戶信息存在redis,借助session_id表示。

好處就是:把自己的一套session機(jī)制抽象為類,如果之后session不存在redis,后期可以直接通過修改類文件解決問題。

作者:齊亞威

來源:宜信技術(shù)學(xué)院


網(wǎng)頁題目:如何運(yùn)用PHP+REDIS解決負(fù)載均衡后的session共享
當(dāng)前URL:http://weahome.cn/article/poieej.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部