PHP + Memcache 實現多服務器session共享

不少時候一個完整的系統可能運行在多個服務器上,若是這多個服務器之間須要共享session的話,那麼php默認的files保存session的方式就無能爲力了。這時咱們能夠考慮使用memcache 來接管session的保存與讀取工做。 php

第一步:咱們須要在服務器上搭建必要的環境,node

php 、web server的安裝不是主題就很少說了,其餘還須要的是 memcached 服務端、php_memcache擴展mysql

下面安裝爲centos 下的示例(注:如下安裝命令跟服務器配置有關,不能保證通用性,請根據實際狀況進行調整)web

安裝 memcached sql

$ yum install memcached
 

安裝php_memcache擴展數據庫

$ yum install php-pecl-memcache
 

或者centos

$ pecl install memcache
 

注:擴展安裝完畢後須要重啓web server來使用擴展生效瀏覽器

第二步:啓動memcached服務進程服務器

 $ /usr/bin/memcached -p 12321 -m 384M -u nobody -d
 

第三步:檢查php擴展是否正確安裝cookie

一、命令行執行php -m 查詢結果中是否有memcache項

二、建立phpinfo()頁面,查詢session項下面的Registered save handlers值中是否有memcache項

四步:在兩臺服務器上進行測試

測試代碼示例:

<?php
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');
session_start();
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 />";
?>
 

保存上面代碼(注意替換域名和IP),分別放在兩臺服務器的web目錄下,打開兩個瀏覽器標籤,前後訪問兩個地址,若是兩個頁面輸出的session_time後的時間戳和session_id是同樣的話就說明已經OK了。

第五步:修改現有代碼,切換php的session.save_handler

在全部須要共享session的入口文件中都增長如下代碼(須要加在session_start()函數以前)

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');
 
 

或者也能夠直接到php.ini中修改上面三行的相應的取值,這樣就不須要改動已有的PHP代碼,根據實際狀況選擇方案。

第一行是指定session的保存方式

第二行是指定session_id生成的cookie域,也就是你想要共享session的cookie域,注意替換成本身的域名

第三行是session的保存路徑,這裏是使用tcp去鏈接memcached端口,注意替換成本身的提供memcache服務的服務器IP

OK,大功告成了。

注:因爲memcache協議是不須要權限驗證的,任何人均可以訪問memcache中存儲的數據,因此須要設置好防火牆規則,禁止未受權IP訪問,或者在啓動memcached進程時使用 -l 參數指定只監聽局域網IP。

固然,要實現多機session共享還有其餘不少方式,

如:

一、tokyo tyrant ,這個和memcache原理相同

二、session保存在數據庫中(須要本身定時清理數據庫中過時的session)

三、經過NFS文件共享的方式,多臺WEB服務器共享保存session文件的磁盤 http://imysql.cn/?q=node/202

相關文章
相關標籤/搜索