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 存儲
用例子測試一下:
4. 用 sessionid 去 memcached 裡查詢一下:
會看到
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
5. 用 sessionid 去 memcached 裡查詢一下
復制代碼 代碼如下:
輸出結果:
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 2592