PHP + Memcache 實現多服務器session共享
很多時候一個完整的系統可能運行在多個服務器上,如果這多個服務器之間需要共享session的話,那么php默認的files保存session的方式就無能為力了。這時我們可以考慮使用memcache 來接管session的保存與讀取工作。
第一步:我們需要在服務器上搭建必要的環境,
php 、web server的安裝不是主題就不多說了,其他還需要的是 memcached 服務端、php_memcache擴展
下面安裝為centos 下的示例(注:以下安裝命令跟服務器配置有關,不能保證通用性,請根據實際情況進行調整)
安裝 memcached
</div>
</div>
安裝php_memcache擴展
</div>
</div>
或者
</div>
</div>
注:擴展安裝完畢后需要重啟web server來使用擴展生效
第二步:啟動memcached服務進程
</div>
</div>
第三步:檢查php擴展是否正確安裝
1、命令行執行php -m 查詢結果中是否有memcache項
2、創建phpinfo()頁面,查詢session項下面的Registered save handlers值中是否有memcache項
第四步:在兩臺服務器上進行測試
測試代碼示例:
ini_set('session.save_handler', 'memcache');
ini_set('session.cookie_domain','.sample.com');
ini_set('session.save_path','tcp://10.22.229.141:12321?persistent=1&weight=1&timeout=1&retry_interval=15');
if (!isset($_SESSION['session_time'])) {
$_SESSION['session_time'] = time();
}
echo "session_time:".$_SESSION['session_time']."<br />";
echo "now_time:".time()."<br />";
echo "session_id:".session_id()."<br />";
?>
</div>
</div>
保存上面代碼(注意替換域名和IP),分別放在兩臺服務器的web目錄下,打開兩個瀏覽器標簽,先后訪問兩個地址,如果兩個頁面輸出的session_time后的時間戳和session_id是一樣的話就說明已經OK了。
第五步:修改現有代碼,切換php的session.save_handler
在所有需要共享session的入口文件中都增加以下代碼(需要加在session_start()函數之前)
ini_set('session.cookie_domain','.sample.com');
ini_set('session.save_path','tcp://10.22.229.141:12321?persistent=1&weight=1&timeout=1&retry_interval=15');
</div>
</div>
或者也可以直接到php.ini中修改上面三行的相應的取值,這樣就不需要改動已有的PHP代碼,根據實際情況選擇方案。
第一行是指定session的保存方式
第二行是指定session_id生成的cookie域,也就是你想要共享session的cookie域,注意替換成自己的域名
第三行是session的保存路徑,這里是使用tcp去連接memcached端口,注意替換成自己的提供memcache服務的服務器IP
OK,大功告成了。
注:由于memcache協議是不需要權限驗證的,任何人都可以訪問memcache中存儲的數據,所以需要設置好防火墻規則,禁止未授權IP訪問,或者在啟動memcached進程時使用 -l 參數指定只監聽局域網IP。
當然,要實現多機session共享還有其他很多方式,
如:
1、tokyo tyrant ,這個和memcache原理相同
2、session保存在數據庫中(需要自己定時清理數據庫中過期的session)
3、通過NFS文件共享的方式,多臺WEB服務器共享保存session文件的磁盤 http://imysql.cn/?q=node/202
</div>