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

openkk 13年前發布 | 5K 次閱讀 godropbox Arx Libertatis

很多時候一個完整的系統可能運行在多個服務器上,如果這多個服務器之間需要共享session的話,那么php默認的files保存session的方式就無能為力了。這時我們可以考慮使用memcache 來接管session的保存與讀取工作。 

第一步:我們需要在服務器上搭建必要的環境,

php 、web server的安裝不是主題就不多說了,其他還需要的是 memcached 服務端、php_memcache擴展

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

安裝 memcached

$ yum install memcached

 

</div>

</div>

安裝php_memcache擴展

$ yum install php-pecl-memcache

 

</div>

</div>

或者

$ pecl install memcache

 

</div>

</div>

注:擴展安裝完畢后需要重啟web server來使用擴展生效

第二步:啟動memcached服務進程

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

 

</div>

</div>

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

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

2、創建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 />";
?>

 

</div>

</div>

保存上面代碼(注意替換域名和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');
 

 

</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>

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!