Ubuntu server 11.04安裝memcache及php使用memcache來存儲session的方法
本文實例講述了Ubuntu server 11.04安裝memcache及php使用memcache來存儲session的方法。分享給大家供大家參考,具體如下:
1、首先安裝memcache服務(wù)端:
sudo apt-get install memcached
安裝完成后系統(tǒng) 自動啟動了 memcached服務(wù)占用11211端口
如需重新配置11211端口的服務(wù) 需要關(guān)閉已開啟的memcached服務(wù)
手動啟動:
memcached -d -m 128 -p 11211 -u memcache
這里需要說明一下memcached服務(wù)的啟動參數(shù):
-p 監(jiān)聽的端口
-l 連接的IP地址, 默認(rèn)是本機(jī)
-d start 啟動memcached服務(wù)
-d restart 重起memcached服務(wù)
-d stop|shutdown 關(guān)閉正在運行的memcached服務(wù)
-d install 安裝memcached服務(wù)
-d uninstall 卸載memcached服務(wù)
-u 以的身份運行 (僅在以root運行的時候有效)
-m 最大內(nèi)存使用,單位MB。默認(rèn)64MB
-M 內(nèi)存耗盡時返回錯誤,而不是刪除項
-c 最大同時連接數(shù),默認(rèn)是1024
-f 塊大小增長因子,默認(rèn)是1.25-n 最小分配空間,key+value+flags默認(rèn)是48
-h 顯示幫助
2、安裝PHP Memecache 客戶端
$ sudo apt-get install php5-memcache
重啟web服務(wù)器
測試memcache代碼:
<?php $mem = new Memcache; //創(chuàng)建Memcache對象 $mem->connect("127.0.0.1", 11211); //連接Memcache服務(wù)器 $val = "這是一個Memcache的測試."; $key = md5($val); if(($k = $mem->get($key))){ //判斷是否獲取到指定的key echo 'from cache:'.$k; } else { echo 'normal'; //這里我們在實際使用中就需要替換成查詢數(shù)據(jù)庫并創(chuàng)建緩存. $mem->set($key, $val, 0, 120); //增加插入一條緩存,緩存時間為120s }
用memcache存儲session
一般地, Session 是以文本文件形式存儲在服務(wù)器端的。如果使用 Seesion,或者該 PHP 文件要調(diào)用 Session 變量,那么就必須在調(diào)用 Session 之前啟動它,使用 session_start() 函數(shù)。其它都不需要你設(shè)置了,PHP 自動完成 Session 文件的創(chuàng)建。其默認(rèn) 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 中,一旦宕機(jī),數(shù)據(jù)將會丟失。但對 session 數(shù)據(jù)來說并不是嚴(yán)重的問題。
如何用 memcached 來存儲 session呢?以下是基本的配置步驟:
1. 安裝 memcached (略過,不清楚的筒子可以查看前面一篇文章:http://www.dbjr.com.cn/article/85510.htm)
在 phpinfo 輸出中的 "Registered save handlers" 會有 "files user sqlite"。
2. 修改配置文件,
①. 在 php.ini 中全局設(shè)置(* 需要重啟服務(wù)器)
session.save_handler = memcache session.save_path = "tcp://127.0.0.1:11211"
②. 或者某個目錄下的 .htaccess :
php_value session.save_handler "memcache" php_value session.save_path "tcp://127.0.0.1:11211"
③. 也可以在某個一個應(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
4.測試 創(chuàng)建一個 session
<?php //set_session.php session_start(); if (!isset($_SESSION['admin'])) { $_SESSION['admin'] = '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('0935216dbc0d721d629f89efb89affa6')); ?>
輸出結(jié)果:
string(16) "admin|s:3:"wan";"
證明 session 正常工作。
再次深入 多域名網(wǎng)站利用MEMCACHE方式共享SESSION數(shù)據(jù)
通過了解 SESSION 的工作原理,我們可以發(fā)現(xiàn),在默認(rèn)情況下,各個服務(wù)器會各自分別對同一個客戶端產(chǎn)生 SESSION ID,如對于同一個用戶瀏覽器,A 服務(wù)器產(chǎn)生的 SESSION ID 是 30de1e9de3192ba6ce2992d27a1b6a0a,而 B 服務(wù)器生成的則是 c72665af28a8b14c0fe11afe3b59b51b。另外,PHP 的 SESSION 數(shù)據(jù)都是分別保存在本服務(wù)器的文件系統(tǒng)中。
確定了問題所在之后,就可以著手進(jìn)行解決了。想要共享 SESSION 數(shù)據(jù),那就必須實現(xiàn)兩個目標(biāo):一個是各個服務(wù)器對同一個客戶端產(chǎn)生的 SESSION ID 必須相同,并且可通過同一個 COOKIE 進(jìn)行傳遞,也就是說各個服務(wù)器必須可以讀取同一個名為 PHPSESSID 的 COOKIE;另一個是 SESSION 數(shù)據(jù)的存儲方式/位置必須保證各個服務(wù)器都能夠訪問到。簡單地說就是多服務(wù)器共享客戶端的 SESSION ID,同時還必須共享服務(wù)器端的 SESSION 數(shù)據(jù)。
第一個目標(biāo)的實現(xiàn)其實很簡單,只需要對 COOKIE 的域(domain)進(jìn)行特殊地設(shè)置即可,默認(rèn)情況下,COOKIE 的域是當(dāng)前服務(wù)器的域名/IP 地址,而域不同的話,各個服務(wù)器所設(shè)置的 COOKIE 是不能相互訪問的,如 www.aaa.com 的服務(wù)器是不能讀寫 www.bbb.com 服務(wù)器設(shè)置的 COOKIE 的。這里我們所說的同一網(wǎng)站的服務(wù)器有其特殊性,那就是他們同屬于同一個一級域,如:tieba.xiaoyuan.com 和 www.xiaoyuan.com 都屬于域 .xiaoyuan.com,那么我們就可以設(shè)置 COOKIE 的域為 .xiaoyuan.com,這樣 tieba.xiaoyuan.com、www.xiaoyuan.com 等等都可以訪問此 COOKIE。PHP 代碼中的設(shè)置方法如下:
<?php ini_set('session.cookie_domain', 'xiaoyuan.com'); ?>
這樣各個服務(wù)器共享同一客戶端 SESSION ID 的目的就達(dá)到了。
于是 可以在 a.domain.com 下
session.php
<?php ini_set('session.cookie_domain', 'domain.com'); session_start(); if (!isset($_SESSION['admin'])) { $_SESSION['admin'] = 'wan'; } print $_SESSION['admin']; print "\n"; print session_id();
在b.domain.com下
session2.php
<?php ini_set('session.cookie_domain', 'domain.com'); session_start(); echo $_SESSION['admin'];
希望本文所述對大家Ubuntu平臺上的php程序設(shè)計有所幫助。
- PHP開發(fā)負(fù)載均衡指南
- Nginx 安裝筆記(含PHP支持、虛擬主機(jī)、反向代理負(fù)載均衡)
- 基于php使用memcache存儲session的詳解
- PHP中使用memcache存儲session的三種配置方法
- 利用Memcached在php下實現(xiàn)session機(jī)制 替換PHP的原生session支持
- php將session放入memcached的設(shè)置方法
- 在php中設(shè)置session用memcache來存儲的方法總結(jié)
- thinkPHP多域名情況下使用memcache方式共享session數(shù)據(jù)的實現(xiàn)方法
- PHP保存session到memcache服務(wù)器的方法
- PHP實現(xiàn)分布式memcache設(shè)置web集群session同步的方法
- PHP實現(xiàn)負(fù)載均衡下的session共用功能
相關(guān)文章
php實現(xiàn)的仿阿里巴巴實現(xiàn)同類產(chǎn)品翻頁
當(dāng)前頁左邊的頁碼為最新的產(chǎn)品,按更新時間呈升序排列;右邊的頁碼為早期的產(chǎn)品, 按更新時間呈降序排列。2009-12-12解析PHP自帶的進(jìn)位制之間的轉(zhuǎn)換函數(shù)
本篇文章是對PHP自帶的進(jìn)位制之間的轉(zhuǎn)換函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06php使用遞歸函數(shù)實現(xiàn)數(shù)字累加的方法
這篇文章主要介紹了php使用遞歸函數(shù)實現(xiàn)數(shù)字累加的方法,涉及php遞歸操作的技巧,需要的朋友可以參考下2015-03-03使用php+Ajax實現(xiàn)唯一校驗實現(xiàn)代碼[簡單應(yīng)用]
使用php+Ajax實現(xiàn)唯一校驗實現(xiàn)代碼[簡單應(yīng)用],前臺用ajax后臺用php,需要的朋友可以參考下。2011-11-11