web伺服器的php session都給memcached ,這樣你不管分發器把 ip串連分給哪個web伺服器都不會有問題了,配置方法很簡單,就在php的設定檔內
增加一條語句就可以了,不過前提你需要裝好memcache模組
1.設定session用memcache來儲存
方法I: 在 php.ini 中全域設定
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: 再或者在某個一個應用中:
ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://127.0.0.1:11211");
使用多個 memcached server 時用逗號","隔開,並且和 Memcache::addServer() 文檔中說明的一樣,可以帶額外的參數"persistent"、"weight"、"timeout"、"retry_interval" 等等,類似這樣的:"tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2" 。
如果安裝的PECL是memcached(使用libmemcache庫的那個),則配置應為
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的伺服器端:
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使用的記憶體數量,單位是MB,我這裡是100MB,
-u是運行Memcache的使用者,我這裡是root,
-l是監聽的伺服器IP地址,如果有多個地址的話,我這裡指定了伺服器的IP地址192.168.36.200,
-p是設定Memcache監聽的連接埠,我這裡設定了11211,最好是1024以上的連接埠,我們這裡統一使用11211
-c選項是最大啟動並執行並發串連數,預設是1024,我這裡設定了256,按照你伺服器的負載量來設定。
-P是設定儲存Memcache的pid檔案,我這裡是儲存在/tmp/memcached.pid,
3. 在程式中使用 memcache 來作 session 儲存
用例子測試一下:
複製代碼 代碼如下:
<?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 裡查詢一下:
複製代碼 代碼如下:
<?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 時快很多,而且在多個伺服器需要共用 session 時會比較方便,將這些伺服器都配置成使用同一組 memcached 伺服器就可以,減少了額外的工作量。缺點是 session 資料都儲存在 memory 中,持久化方面有所欠缺,但對 session 資料來說也不是很大的問題。
===================================
一般地, Session 是以文字檔形式儲存在伺服器端的。如果使用 Seesion,或者該 PHP 檔案要調用 Session 變數,那麼就必須在調用 Session 之前啟動它,使用 session_start() 函數。其它都不需要你設定了,PHP 自動完成 Session 檔案的建立。其預設 Session 的存放路徑是伺服器的系統臨時檔案夾。
但是如果碰到大資料量的Sesstion的時候, 使用基於檔案的Session存取瓶頸可能都是在磁碟IO操作上,現在利用Memcached來儲存Session資料,直接通過記憶體的方式,效率自然能夠提高不少。 在讀寫速度上會比 files 時快很多,而且在多個伺服器需要共用 session 時會比較方便,將這些伺服器都配置成使用同一組 memcached 伺服器就可以,減少了額外的工作量。
其缺點是 session 資料都儲存在 memory 中,一旦宕機,資料將會丟失。但對 session 資料來說並不是嚴重的問題。
如何用 memcached 來儲存 session呢?以下是基本的配置步驟:
1. 安裝 memcached
在 phpinfo 輸出中的 “Registered save handlers” 會有 “files user sqlite”。
2. 修改設定檔,
a. 在 php.ini 中全域設定(* 需要重啟伺服器)
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. 也可以在某個一個應用中:
ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://127.0.0.1:11211");
註:使用多個 memcached server 時用逗號”,”隔開,並且和 Memcache::addServer() 文檔中說明的一樣,可以帶額外的參數”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.測試 建立一個 session
複製代碼 代碼如下:
<?php
//set_session.php
session_start();
if (!isset($_SESSION['admin'])) {
$_SESSION['TEST'] = 'wan';
}
print $_SESSION['admin'];
print "\n";
print session_id();
?>
5. 用 sessionid 去 memcached 裡查詢一下
複製代碼 代碼如下:
<?php
//get_session.php
$mem = new Memcache;
$mem->connect("127.0.0.1", 11211);
var_dump($mem->get('0935216dbc0d721d629f89efb89affa 6'));
?>
複製代碼 代碼如下:
[root@localhost html]# /usr/local/webserver/php/bin/php -f get_session.php
輸出結果:
string(16)
"admin|s:3:"wan";"
證明 session 正常工作。
===========================
用 memcache 來儲存 session 在讀寫速度上應該會比檔案快很多,而且在多個伺服器需要共用 session 時會比較方便,將這些伺服器都配置成使用同一組 memcached 伺服器就可以,減少了額外的工作量。缺點是 session 資料都儲存在記憶體中,不能持久化儲存,如果想持久化儲存,可以考慮使用Memcachedb來儲存,或用Tokyo Tyrant+Tokyo Cabinet來進行儲存。
怎樣判斷session失效了呢?在php.ini中有個Session.cookie_lifetime的選項,這個代表SessionID在用戶端Cookie儲存的時間,預設值是“0”,代表瀏覽器一關閉,SessionID就作廢,這樣不管儲存在Memcached中的Session是否還有效(儲存在Memcached中的session會利用Memcached的內部機制進行處理,即使session資料沒有失效,而由於用戶端的SessionID已經失效,所以這個key基本上不會有機會使用了,利用Memcached的LRU原則,如果Memcached的記憶體不夠用了,新的資料就會取代到期以及最老的未被使用的資料),因為SessionID已經失效了,所以在用戶端會重建一個新的SessionID。
儲存在Memcached中的資料最長不會超過30天,這個時間是以操作Memcached的時間為基準的,也就是說,只要key還是原來的key,如果你重新對此key進行了相關的操作(如set操作),且重新設定了有效期間,則此時此key對應的資料的有效期間會重新計算的,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(最近最少用)演算法+逾時失效。當您存資料到memcached中,可以指定該資料在緩衝中可以呆多久。如果memcached的記憶體不夠用了,到期的slabs會優先被替換,接著就輪到最老的未被使用的slabs。
===========================
為了使web應用能使用saas模式的大規模訪問,必須實現應用的叢集部署.要實現叢集部署主要需要實現session共用機制,使得多台應用伺服器之間會話統一, tomcat等多數服務都採用了session複製技術實現session的共用.
session複製技術的問題:
(1)技術複雜,必須在同一種中介軟體之間完成(如:tomcat-tomcat之間).
(2)在節點持續增多的情況下,session複製帶來的效能損失會快速增加.特別是當session中儲存了較大的對象,而且對象變化較快時,效能下降更加顯著.這種特性使得web應用的水平擴充受到了限制.
session共用的另一種思路就是把session集中起來管理,首先想到的是採用資料庫來集中儲存session,但資料庫是檔案儲存體相對記憶體慢了一個數量級,同時這勢必加大資料庫系統的負擔.所以需要一種既速度快又能遠程集中儲存的服務,所以就想到了memcached.
memcached能緩衝什嗎?
通過在記憶體裡維護一個統一的巨大的hash表,Memcached能夠用來儲存各種格式的資料,包括映像、視頻、檔案以及資料庫檢索的結果等。
memcached快嗎?
非常快。memcached使用了libevent(如果可以的話,在linux下使用epoll)來均衡任何數量的開啟連結,使用非阻塞的網路I/O,對內部對象實現引用計數(因此,針對多樣的用戶端,對象可以處在多樣的狀態), 使用自己的頁塊分配器和雜湊表, 因此虛擬記憶體不會產生片段並且虛擬記憶體分配的時間複雜度可以保證為O(1).。
使用過程注意幾個問題和改進思路:
1、memcache的記憶體應該足夠大,這樣不會出現使用者session從Cache中被清除的問題(可以關閉memcached的對象退出機制)。
2、如果session的讀取比寫入要多很多,可以在memcache前再加一個Oscache等本機快取,減少對memcache的讀操作,從而減小網路開銷,提高效能。
3、如果使用者非常多,可以使用memcached組,通過set方法中帶hashCode,插入到某個memcached伺服器
對於session的清除有幾種方案:
(1)可以在淩晨人最少的時候,對memcached做一次清空。(簡單)
(2)儲存在緩衝中的對象設定一個失效時間,通過過濾器擷取sessionId的值,定期重新整理memcached中的對象.長時間沒有被重新整理的對象自動被清除.(相對複雜,消耗資源)