如何在php中使用memcache存儲session-創(chuàng)新互聯(lián)

本篇文章為大家展示了如何在php中使用memcache存儲session,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

創(chuàng)新互聯(lián)擁有網(wǎng)站維護技術(shù)和項目管理團隊,建立的售前、實施和售后服務(wù)體系,為客戶提供定制化的做網(wǎng)站、成都網(wǎng)站設(shè)計、網(wǎng)站維護、資陽服務(wù)器托管解決方案。為客戶網(wǎng)站安全和日常運維提供整體管家式外包優(yōu)質(zhì)服務(wù)。我們的網(wǎng)站維護服務(wù)覆蓋集團企業(yè)、上市公司、外企網(wǎng)站、商城網(wǎng)站建設(shè)、政府網(wǎng)站等各類型客戶群體,為全球近千家企業(yè)提供全方位網(wǎng)站維護、服務(wù)器維護解決方案。

php有什么用

php是一個嵌套的縮寫名稱,是英文超級文本預(yù)處理語言,它的語法混合了C、Java、Perl以及php自創(chuàng)新的語法,主要用來做網(wǎng)站開發(fā),許多小型網(wǎng)站都用php開發(fā),因為php是開源的,從而使得php經(jīng)久不衰。

1.設(shè)置session用memcache來存儲


方法I: 在 php.ini 中全局設(shè)置
session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"
方法II: 某個目錄下的 .htaccess :
php_value session.save_handler "memcache"
php_value session.save_path  "tcp://127.0.0.1:11211"
方法III: 再或者在某個一個應(yīng)用中:
ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://127.0.0.1:11211");
使用多個 memcached server 時用逗號","隔開,并且和 Memcache::addServer() 文檔中說明的一樣,可以帶額外的參數(shù)"persistent"、"weight"、"timeout"、"retry_interval" 等等,類似這樣的:"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2" 。
如果安裝的PECL是memcached(使用libmemcache庫的那個),則配置應(yīng)為
ini_set("session.save_handler", "memcached"); // 是memcached不是memcache
ini_set("session.save_path", "127.0.0.1:11211"); // 不要tcp:

2. 啟動 memcached:
memcached -d -l 127.0.0.1 -p 11212 -m 128
或 啟動Memcache的服務(wù)器端:
memcached -d -m 100 -u root -l 192.168.36.200 -p 11211 -c 256 -P /tmp/memcached.pid 
# /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid
引用
    -d選項是啟動一個守護進程,
    -m是分配給Memcache使用的內(nèi)存數(shù)量,單位是MB,我這里是100MB,
    -u是運行Memcache的用戶,我這里是root,
    -l是監(jiān)聽的服務(wù)器IP地址,如果有多個地址的話,我這里指定了服務(wù)器的IP地址192.168.36.200,
    -p是設(shè)置Memcache監(jiān)聽的端口,我這里設(shè)置了11211,好是1024以上的端口,我們這里統(tǒng)一使用11211
    -c選項是較大運行的并發(fā)連接數(shù),默認是1024,我這里設(shè)置了256,按照你服務(wù)器的負載量來設(shè)定。
    -P是設(shè)置保存Memcache的pid文件,我這里是保存在/tmp/memcached.pid,

3. 在程序中使用 memcache 來作 session 存儲
用例子測試一下:


復(fù)制代碼 代碼如下:


    <?php 
    session_start(); 
    if (!isset($_SESSION['TEST'])) { 
        $_SESSION['TEST'] = time(); 
    } 

    $_SESSION['TEST3'] = time(); 

    print $_SESSION['TEST']; 
    print "<br><br>"; 
    print $_SESSION['TEST3']; 
    print "<br><br>"; 
    print session_id(); 
    ?>



4. 用 sessionid 去 memcached 里查詢一下:


復(fù)制代碼 代碼如下:


<?php 
$memcache = memcache_connect('localhost', 11211); 
var_dump($memcache->get('19216821213c65cedec65b0883238c278eeb573e077')); 
$memcache->set('aaaa', 'hello everyone'); 
var_dump($memcache->get('aaaa')); 
?>



會看到
string(37) "TEST|i:1177556731;TEST3|i:1177556881;"
這樣的輸出,證明 session 正常工作。
用 memcache 來存儲 session 在讀寫速度上會比 files 時快很多,而且在多個服務(wù)器需要共用 session 時會比較方便,將這些服務(wù)器都配置成使用同一組 memcached 服務(wù)器就可以,減少了額外的工作量。缺點是 session 數(shù)據(jù)都保存在 memory 中,持久化方面有所欠缺,但對 session 數(shù)據(jù)來說也不是很大的問題。
===================================
一般地, Session 是以文本文件形式存儲在服務(wù)器端的。如果使用 Seesion,或者該 PHP 文件要調(diào)用 Session 變量,那么就必須在調(diào)用 Session 之前啟動它,使用 session_start() 函數(shù)。其它都不需要你設(shè)置了,PHP 自動完成 Session 文件的創(chuàng)建。其默認 Session 的存放路徑是服務(wù)器的系統(tǒng)臨時文件夾。
但是如果碰到大數(shù)據(jù)量的Sesstion的時候, 使用基于文件的Session存取瓶頸可能都是在磁盤IO操作上,現(xiàn)在利用Memcached來保存Session數(shù)據(jù),直接通過內(nèi)存的方式,效率自然能夠提高不少。 在讀寫速度上會比 files 時快很多,而且在多個服務(wù)器需要共用 session 時會比較方便,將這些服務(wù)器都配置成使用同一組 memcached 服務(wù)器就可以,減少了額外的工作量。

其缺點是 session 數(shù)據(jù)都保存在 memory 中,一旦宕機,數(shù)據(jù)將會丟失。但對 session 數(shù)據(jù)來說并不是嚴重的問題。
如何用 memcached 來存儲 session呢?以下是基本的配置步驟:
1. 安裝 memcached
在 phpinfo 輸出中的 “Registered save handlers” 會有 “files user sqlite”。

2. 修改配置文件,
a. 在 php.ini 中全局設(shè)置(* 需要重啟服務(wù)器)

session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"
b. 或者某個目錄下的 .htaccess :
php_value session.save_handler "memcache"
php_value session.save_path "tcp://127.0.0.1:11211"
c. 也可以在某個一個應(yīng)用中:
ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://127.0.0.1:11211");
注:使用多個 memcached server 時用逗號”,”隔開,并且和 Memcache::addServer() 文檔中說明的一樣,可以帶額外的參數(shù)”persistent”、”weight”、”timeout”、”retry_interval” 等等,類似這樣的:”tcp://host:port?persistent=1&weight=2,tcp://host2 :port2″ 。

3. 啟動 memcached
memcached -d -m 10 -u root -l 127.0.0.1 -p 11211 -c 256 -P /tmp/memcached.pid

4.測試 創(chuàng)建一個 session


復(fù)制代碼 代碼如下:


<?php
//set_session.php
session_start();
if (!isset($_SESSION['admin'])) {
$_SESSION['TEST'] = 'wan';
}
print $_SESSION['admin'];
print "\n";
print session_id();
?>



5. 用 sessionid 去 memcached 里查詢一下


復(fù)制代碼 代碼如下:


<?php
//get_session.php
$mem = new Memcache;
$mem->connect("127.0.0.1", 11211);
var_dump($mem->get('0935216dbc0d721d629f89efb89affa 6'));
?>


復(fù)制代碼 代碼如下:


[root@localhost html]# /usr/local/webserver/php/bin/php -f get_session.php



輸出結(jié)果:
string(16)
"admin|s:3:"wan";"
證明 session 正常工作。
===========================
用 memcache 來存儲 session 在讀寫速度上應(yīng)該會比文件快很多,而且在多個服務(wù)器需要共用 session 時會比較方便,將這些服務(wù)器都配置成使用同一組 memcached 服務(wù)器就可以,減少了額外的工作量。缺點是 session 數(shù)據(jù)都保存在內(nèi)存中,不能持久化存儲,如果想持久化存儲,可以考慮使用Memcachedb來存儲,或用Tokyo Tyrant+Tokyo Cabinet來進行存儲。

怎樣判斷session失效了呢?在php.ini中有個Session.cookie_lifetime的選項,這個代表SessionID在客戶端Cookie儲存的時間,默認值是“0”,代表瀏覽器一關(guān)閉,SessionID就作廢,這樣不管保存在Memcached中的Session是否還有效(保存在Memcached中的session會利用Memcached的內(nèi)部機制進行處理,即使session數(shù)據(jù)沒有失效,而由于客戶端的SessionID已經(jīng)失效,所以這個key基本上不會有機會使用了,利用Memcached的LRU原則,如果Memcached的內(nèi)存不夠用了,新的數(shù)據(jù)就會取代過期以及最老的未被使用的數(shù)據(jù)),因為SessionID已經(jīng)失效了,所以在客戶端會重新生成一個新的SessionID。

保存在Memcached中的數(shù)據(jù)最長不會超過30天,這個時間是以操作Memcached的時間為基準的,也就是說,只要key還是原來的key,如果你重新對此key進行了相關(guān)的操作(如set操作),且重新設(shè)置了有效期,則此時此key對應(yīng)的數(shù)據(jù)的有效期會重新計算的,php手冊中有說明

Expiration time of the item. If it's equal to zero, the item will never expire. You can also use Unix timestamp or a number of seconds starting from current time, but in the latter case the number of seconds may not exceed 2592000 (30 days).

Memcached主要的cache機制是LRU(最近最少用)算法+超時失效。當您存數(shù)據(jù)到memcached中,可以指定該數(shù)據(jù)在緩存中可以呆多久。如果memcached的內(nèi)存不夠用了,過期的slabs會優(yōu)先被替換,接著就輪到最老的未被使用的slabs。
===========================
為了使web應(yīng)用能使用saas模式的大規(guī)模訪問,必須實現(xiàn)應(yīng)用的集群部署.要實現(xiàn)集群部署主要需要實現(xiàn)session共享機制,使得多臺應(yīng)用服務(wù)器之間會話統(tǒng)一, tomcat等多數(shù)服務(wù)都采用了session復(fù)制技術(shù)實現(xiàn)session的共享.
session復(fù)制技術(shù)的問題:
(1)技術(shù)復(fù)雜,必須在同一種中間件之間完成(如:tomcat-tomcat之間).
(2)在節(jié)點持續(xù)增多的情況下,session復(fù)制帶來的性能損失會快速增加.特別是當session中保存了較大的對象,而且對象變化較快時,性能下降更加顯著.這種特性使得web應(yīng)用的水平擴展受到了限制.

session共享的另一種思路就是把session集中起來管理,首先想到的是采用數(shù)據(jù)庫來集中存儲session,但數(shù)據(jù)庫是文件存儲相對內(nèi)存慢了一個數(shù)量級,同時這勢必加大數(shù)據(jù)庫系統(tǒng)的負擔.所以需要一種既速度快又能遠程集中存儲的服務(wù),所以就想到了memcached.

memcached能緩存什么?
通過在內(nèi)存里維護一個統(tǒng)一的巨大的hash表,Memcached能夠用來存儲各種格式的數(shù)據(jù),包括圖像、視頻、文件以及數(shù)據(jù)庫檢索的結(jié)果等。

memcached快么?
非???。memcached使用了libevent(如果可以的話,在linux下使用epoll)來均衡任何數(shù)量的打開鏈接,使用非阻塞的網(wǎng)絡(luò)I/O,對內(nèi)部對象實現(xiàn)引用計數(shù)(因此,針對多樣的客戶端,對象可以處在多樣的狀態(tài)), 使用自己的頁塊分配器和哈希表, 因此虛擬內(nèi)存不會產(chǎn)生碎片并且虛擬內(nèi)存分配的時間復(fù)雜度可以保證為O(1).。
使用過程注意幾個問題和改進思路:
1、memcache的內(nèi)存應(yīng)該足夠大,這樣不會出現(xiàn)用戶session從Cache中被清除的問題(可以關(guān)閉memcached的對象退出機制)。
2、如果session的讀取比寫入要多很多,可以在memcache前再加一個Oscache等本地緩存,減少對memcache的讀操作,從而減小網(wǎng)絡(luò)開銷,提高性能。
3、如果用戶非常多,可以使用memcached組,通過set方法中帶hashCode,插入到某個memcached服務(wù)器
對于session的清除有幾種方案:
(1)可以在凌晨人最少的時候,對memcached做一次清空。(簡單)
(2)保存在緩存中的對象設(shè)置一個失效時間,通過過濾器獲取sessionId的值,定期刷新memcached中的對象.長時間沒有被刷新的對象自動被清除.(相對復(fù)雜,消耗資源)


上述內(nèi)容就是如何在php中使用memcache存儲session,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

名稱欄目:如何在php中使用memcache存儲session-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://www.muchs.cn/article14/dpgige.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司、電子商務(wù)定制網(wǎng)站、網(wǎng)站制作關(guān)鍵詞優(yōu)化、定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護公司