session 如何存儲於memcache

       web服務器的php session都給memcached ,這樣你無論分發器把 ip鏈接分給哪一個web服務器都不會有問題了,配置方法很簡單,就在php的配置文件內
增長一條語句就能夠了,不過前提你須要裝好memcache模塊php

1.設置session用memcache來存儲html

方法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:linux

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,web

     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 裏查詢一下:
sql

代碼以下:

<?php  
$memcache = memcache_connect('127.0.0.1', 11211);  
var_dump($memcache->get('165b0883238c278eeb573e077'));  
$memcache->set('aaaa', '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
tomcat

  代碼以下:

  <?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).。
使用過程注意幾個問題和改進思路: 
  一、memcache的內存應該足夠大,這樣不會出現用戶session從Cache中被清除的問題(能夠關閉memcached的對象退出機制)。 
  二、若是session的讀取比寫入要多不少,能夠在memcache前再加一個Oscache等本地緩存,減小對memcache的讀操做,從而減少網絡開銷,提升性能。 
  三、若是用戶很是多,可使用memcached組,經過set方法中帶hashCode,插入到某個memcached服務器 
對於session的清除有幾種方案:  (1)能夠在凌晨人最少的時候,對memcached作一次清空。(簡單)  (2)保存在緩存中的對象設置一個失效時間,經過過濾器獲取sessionId的值,按期刷新memcached中的對象.長時間沒有被刷新的對象自動被清除.(相對複雜,消耗資源)

相關文章
相關標籤/搜索