目錄
PHP实现多服务器session共享之memcache共享
首頁 後端開發 php教程 PHP兑现多服务器session共享之memcache共享

PHP兑现多服务器session共享之memcache共享

Jun 13, 2016 pm 01:06 PM
memcache return session

PHP实现多服务器session共享之memcache共享

使用基于文件的Session存取瓶颈可能都是在磁盘IO操作上,所以对付小数据量的Session没有问题,但是如果碰到大数据量的Sesstion,那么可能无法胜任,现在利用Memcache来保存Session数据,直接通过内存的方式,效率自然能够提高不少

首先打开php.ini文件,找到session的部分:(分号后面的是注释)

[Session]
; Handler used to store/retrieve data.
session.save_handler = files ; 这个是session的方式,默认的files就可以了,代表用文件储存,

还有两种方式,user和memcache。

user方式指的是你自己(也就是 用户)定义session的句柄,用于session的存取等 ,这个可以把session扩展存到数据库里

memcache方式,需要你配置好memcache ,还要配置session.save_path。

用memcache来作PHP 的session.save_handler

ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://127.0.0.1:11211,tcp://192.168.1.12:11211");
登入後複製

用memcached 来作PHP 的session.save_handler

ini_set("session.save_handler","memcached");
ini_set("session.save_path","127.0.0.1:11211");
登入後複製

PHP实现多服务器session共享之memcache共享

再自定义一套session处理机制,关于session的实现方法我就不再多讲,直接贴程序了。

<?php /* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
//===========================================
// 程序:   Memcache-Based Session Class
// 功能:   基于Memcache存储的 Session 功能类
// 作者:    yejr
// 网站:    http://imysql.cn
// 时间:    2007-01-05
//===========================================

/**
 * 文件:    MemcacheSession.inc.php
 * 类名:    MemcacheSession Class
 * 功能:    自主实现基于Memcache存储的 Session 功能
 * 描述:    这个类就是实现Session的功能,基本上是通过
 *          设置客户端的Cookie来保存SessionID,
 *          然后把用户的数据保存在服务器端,最后通过
 *          Cookie中的Session Id来确定一个数据是否是用户的,
 *          然后进行相应的数据操作
 *
 *          本方式适合Memcache内存方式存储Session数据的方式,
 *          同时如果构建分布式的Memcache服务器,
 *          能够保存相当多缓存数据,并且适合用户量比较多并发比较大的情况
 *
 * 注意: 本类必须要求PHP安装了Memcache扩展或者必须有Memcache的PHP API
 *       获取Memcache扩展请访问: http://pecl.php.net
 */

//设定 SESSION 有效时间,单位是 秒
define('SESS_LIFTTIME', 3600);

//定义memcache配置信息
define('MEMCACHE_HOST', 'localhost');
define('MEMCACHE_PORT', '10000');

if (!defined('MemcacheSession'))
{
	define('MemcacheSession',    TRUE);
	class MemacheSession
	{
		// {{{ 类成员属性定义
		static  $mSessSavePath;
		static  $mSessName;
		static  $mMemcacheObj;
		// }}}

		// {{{ 初始化构造函数
		/**
     * 构造函数
     *
     * @param string $login_user    登录用户
     * @param int $login_type       用户类型
     * @param string $login_sess    登录Session值
     * @return Esession
     */
		public function __construct()
		{
			//我的memcache是以php模块的方式编译进去的,可以直接调用
			//如果没有,就请自己包含 Memcache-client.php 文件
			if (!class_exists('Memcache') || !function_exists('memcache_connect'))
			{
				die('Fatal Error:Can not load Memcache extension!');
			}

			if (!empty(self::$mMemcacheObj) && is_object(self::$mMemcacheObj))
			{
				return false;
			}

			self::$mMemcacheObj = new Memcache;

			if (!self::$mMemcacheObj->connect(MEMCACHE_HOST , MEMCACHE_PORT))
			{
				die('Fatal Error: Can not connect to memcache host '. MEMCACHE_HOST .':'. MEMCACHE_PORT);
			}

			return TRUE;
		}
		// }}}

	/** {{{ sessOpen($pSavePath, $name)
     *
     * @param   String  $pSavePath
     * @param   String  $pSessName
     *
     * @return  Bool    TRUE/FALSE
     */
		public function sessOpen($pSavePath = '', $pSessName = '')
		{
			self::$mSessSavePath    = $pSavePath;
			self::$mSessName        = $pSessName;
			return TRUE;
		}
		// }}}

	/** {{{ sessClose()
     *
     * @param   NULL
     *
     * @return  Bool    TRUE/FALSE
     */
		public function sessClose()
		{
			return TRUE;
		}
		// }}}

	/** {{{ sessRead($wSessId)
     *
     * @param   String  $wSessId
     *
     * @return  Bool    TRUE/FALSE
     */
		public function sessRead($wSessId = '')
		{
			$wData = self::$mMemcacheObj->get($wSessId);

			//先读数据,如果没有,就初始化一个
			if (!empty($wData))
			{
				return $wData;
			}
			else
			{
				//初始化一条空记录
				$ret = self::$mMemcacheObj->set($wSessId, '', 0, SESS_LIFTTIME);
				if (TRUE != $ret)
				{
					die("Fatal Error: Session ID $wSessId init failed!");
					return FALSE;
				}
				return TRUE;
			}
		}
		// }}}

		/** {{{ sessWrite($wSessId, $wData)
     *
     * @param   String  $wSessId
     * @param   String  $wData
     *
     * @return  Bool    TRUE/FALSE
     */
		public function sessWrite($wSessId = '', $wData = '')
		{
			$ret = self::$mMemcacheObj->replace($wSessId, $wData, 0, SESS_LIFTTIME);
			if (TRUE != $ret)
			{
				die("Fatal Error: SessionID $wSessId Save data failed!");
				return FALSE;
			}
			return TRUE;
		}
		// }}}

	/** {{{ sessDestroy($wSessId)
     *
     * @param   String  $wSessId
     *
     * @return  Bool    TRUE/FALSE
     */
		public function sessDestroy($wSessId = '')
		{
			self::sessWrite($wSessId);
			return FALSE;
		}
		// }}}

	/** {{{ sessGc()
     *
     * @param   NULL
     *
     * @return  Bool    TRUE/FALSE
     */
		public function sessGc()
		{
			//无需额外回收,memcache有自己的过期回收机制
			return TRUE;
		}
		// }}}

	/** {{{ initSess()
     *
     * @param   NULL
     *
     * @return  Bool    TRUE/FALSE
     */
		public function initSess()
		{
			//不使用 GET/POST 变量方式
			ini_set('session.use_trans_sid',    0);

			//设置垃圾回收最大生存时间
			ini_set('session.gc_maxlifetime',   SESS_LIFTTIME);

			//使用 COOKIE 保存 SESSION ID 的方式
			ini_set('session.use_cookies',      1);
			ini_set('session.cookie_path',      '/');
			
			$domain = '.imysql.cn';
			//多主机共享保存 SESSION ID 的 COOKIE
			ini_set('session.cookie_domain',    $domain);

			//将 session.save_handler 设置为 user,而不是默认的 files
			session_module_name('user');

			//定义 SESSION 各项操作所对应的方法名:
			session_set_save_handler(
				array('MemacheSession', 'sessOpen'),   //对应于静态方法 My_Sess::open(),下同。
				array('MemacheSession', 'sessClose'),
				array('MemacheSession', 'sessRead'),
				array('MemacheSession', 'sessWrite'),
				array('MemacheSession', 'sessDestroy'),
				array('MemacheSession', 'sessGc')
			);

			session_start();
			return TRUE;
		}
		// }}}
	}//end class
}//end define

$memSess    = new MemacheSession;
$memSess->initSess();
?>
登入後複製

?然后,在项目程序的头文件中直接包含 MemacheSession.inc.php 即可,并且以前的程序不用做任何改动。
测试 创建一个session

<?php //set_session.php
session_start();
if (!isset($_SESSION['admin'])) {
    $_SESSION['TEST'] = 'wan';
}
print $_SESSION['admin'];
print "/n";
print session_id();
?>
登入後複製

用 sessionid 去 memcached 里查询一下

<?php //get_session.php
$mem = new Memcache;
$mem->connect("127.0.0.1", 11211);
var_dump($mem->get('0935216dbc0d721d629f89efb89affa6'));
?>
登入後複製
?

备注:memcache PECL 未来版本中,可以直接设置 php.ini 来这定自己的 session.save_handler,大致如下:

session.save_handler = memcache
session.save_path = "tcp://host:port?persistent=1&weight=2&timeout=2&retry_interval=15,tcp://host2:port2"
登入後複製

1 楼 any_luf 2012-02-08  
 PHP兑现多服务器session共享之memcache共享
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1269
29
C# 教程
1248
24
C語言return的用法詳解 C語言return的用法詳解 Oct 07, 2023 am 10:58 AM

C語言return的用法有:1、對於傳回值類型為void的函數,可以使用return語句來提前結束函數的執行;2、對於傳回值型別不為void的函數,return語句的作用是將函數的執行結果傳回給呼叫者;3、提前結束函數的執行,在函數內部,我們可以使用return語句來提前結束函數的執行,即使函數並沒有回傳值。

session失效怎麼解決 session失效怎麼解決 Oct 18, 2023 pm 05:19 PM

session失效通常是由於 session 的生存時間過期或伺服器關閉導致的。其解決方法:1、延長session的生存時間;2、使用持久化儲存;3、使用cookie;4、非同步更新session;5、使用會話管理中介軟體。

PHP Session 跨域問題的解決方法 PHP Session 跨域問題的解決方法 Oct 12, 2023 pm 03:00 PM

PHPSession跨域問題的解決方法在前後端分離的開發中,跨域請求已成為常態。在處理跨域問題時,我們通常會涉及session的使用和管理。然而,由於瀏覽器的同源策略限制,跨域情況下預設無法共享session。為了解決這個問題,我們需要採用一些技巧和方法來實現session的跨域共享。一、使用cookie跨域共享session最常

如何使用PHP開發中的Memcache? 如何使用PHP開發中的Memcache? Nov 07, 2023 pm 12:49 PM

在Web開發中,我們經常需要使用快取技術來提高網站的效能和回應速度。 Memcache是​​一種流行的快取技術,它可以快取任何資料類型、支援高並發和高可用性。本文將介紹如何使用PHP開發中的Memcache,並提供具體程式碼範例。一、安裝Memcache要使用Memcache,我們首先需要在伺服器上安裝Memcache擴充。在CentOS作業系統中,可以使用以下命令

JavaScript和PHP的cookie之間有哪些差異? JavaScript和PHP的cookie之間有哪些差異? Sep 02, 2023 pm 12:29 PM

JavaScriptCookie使用JavaScriptcookie是記住和追蹤偏好、購買、佣金和其他資訊的最有效方法。更好的訪客體驗或網站統計所需的資訊。 PHPCookieCookie是儲存在客戶端電腦上的文字檔案並保留它們用於追蹤目的。 PHP透明地支援HTTPcookie。 JavaScriptcookie如何運作?您的伺服器將一些資料傳送到訪客的瀏覽器cookie的形式。瀏覽器可以接受cookie。如果存在,它將作為純文字記錄儲存在訪客的硬碟上。現在,當訪客到達網站上的另一個頁面時

PHP Session 跨域與AJAX的非同步通訊最佳化 PHP Session 跨域與AJAX的非同步通訊最佳化 Oct 12, 2023 am 09:22 AM

PHPSession跨域與AJAX的非同步通訊最佳化隨著互聯網的發展,跨域存取和非同步通訊已成為現代web應用開發的常見需求。本文將重點介紹如何使用PHPSession實現跨域訪問,並提供一些最佳化的方法來改善AJAX的非同步通訊效率。一、跨網域存取的問題在網路開發中,當瀏覽器從一個網域的網頁上發起一個HTTP請求,然後傳回的回應資料屬於另一個網域時,就會發生

PHP開發中如何使用Memcache進行高效率的資料寫入與查詢? PHP開發中如何使用Memcache進行高效率的資料寫入與查詢? Nov 07, 2023 pm 01:36 PM

PHP開發中如何使用Memcache進行高效率的資料寫入與查詢?隨著網路應用的不斷發展,對於系統效能的要求越來越高。在PHP開發中,為了提高系統的效能和反應速度,我們經常使用各種快取技術。而其中一個常用的快取技術就是Memcache。 Memcache是​​一種高效能的分散式記憶體物件快取系統,可以用來快取資料庫查詢結果、頁面片段、會話資料等。透過將資料儲存在內存

PHP開發中如何使用Memcache進行高效率的資料讀寫操作? PHP開發中如何使用Memcache進行高效率的資料讀寫操作? Nov 07, 2023 pm 03:48 PM

在PHP開發中,使用Memcache快取系統可以大幅提高資料讀寫的效率。 Memcache是​​一種基於記憶體的快取系統,它可以將資料緩存在記憶體中,避免頻繁的讀寫資料庫。本文將介紹如何在PHP中使用Memcache進行高效率的資料讀寫操作,並提供具體的程式碼範例。一、安裝和設定Memcache首先,需要在伺服器上安裝Memcache擴充。可以透過

See all articles