導航:首頁 > 編程語言 > php域名session共享

php域名session共享

發布時間:2022-08-06 12:38:19

1. 如何處理多伺服器共享session

在默認情況下,各個伺服器會各自分別對同一個客戶端產生SESSION ID,如對於同一個用戶瀏覽器,A 伺服器產生的 SESSION ID 是
,而 B
伺服器生成的則是。另外,php 的 SESSION
數據都是分別保存在本伺服器的文件系統中。
確定了問題所在之後,就可以著手進行解決了。想要共享 SESSION 數據,那就必須實現兩個目標:
一個是各個伺服器對同一個客戶端產生的 SESSION ID 必須相同,並且可通過同一個 COOKIE 進行傳遞,也就是說各個伺服器必須可以讀取同一個名為 PHPSESSID 的 COOKIE;
另一個是 SESSION 數據的存儲方式/位置必須保證各個伺服器都能夠訪問到。 簡單地說就是多伺服器共享客戶端的 SESSION ID,同時還必須共享伺服器端的 SESSION
數據。
第一個目標的實現其實很簡單,只需要對 COOKIE 的域(domain)進行特殊地設置即可,默認情況下,COOKIE 的域是當前伺服器的域名/IP 地址,而域不同的話,各
個伺服器所設置的 COOKIE 是不能相互訪問的。
四、代碼實現
首先創建數據表,MySQL 的 SQL 語句如下:
CREATE TABLE `sess` (
`sesskey` varchar(32) NOT NULL default '',
`expiry` bigint(20) NOT NULL default '0',
`data` longtext NOT NULL,
PRIMARY KEY (`sesskey`), KEY `expiry` (`expiry`)
) TYPE=MyISAM
sesskey 為 SESSION ID,expiry 為 SESSION 過期時間,data 用於保存 SESSION 數據。
默認情況下 SESSION 數據是以文件方式保存,想要使用資料庫方式保存,就必須重新定義 SESSION 各個操作的處理函數。PHP 提供了 session_set_save_handle()
函數,可以用此函數自定義 SESSION 的處理過程,當然首先要先將 session.save_handler 改成 user,可在 PHP 中進行設置: session_mole_name('user');
接下來著重講一下 session_set_save_handle() 函數,
此函數有六個參數:
session_set_save_handler ( string open, string close, string read,
string write, string destroy, string gc ) 各個參數為各項操作的函數名,這些操作依次是:
打開、關閉、讀取、寫入、銷毀、垃圾回收。PHP 手冊中有詳細的例子,
在這里我們使用 OO 的方式來實現這些操作,詳細代碼如下:

define('MY_SESS_TIME',3600); //SESSION 生存時長
//類定義
class My_Sess
{
/**
* 資料庫連接對象,設置成了靜態變數,因為不設置為靜態變數,資料庫連接對象在其他方法不能被調用,目前還不清楚什麼原因
*
* @var obj
*/
static public $db;
/**
* 構造函數
*
* @param obj $dbname 資料庫連接對象
*/
function __construct($dbname){
self::$db = $dbname;
}
/**
* 初始化session,使用資料庫mysql來存儲session的值,利用session_set_save_handler方法實現
*
*/
function init()
{
$domain = '';
//不使用 GET/POST 變數方式
ini_set('session.use_trans_sid',0);
//設置垃圾回收最大生存時間
ini_set('session.gc_maxlifetime',MY_SESS_TIME);
//使用 COOKIE 保存 SESSION ID 的方式
ini_set('session.use_cookies',1);
ini_set('session.cookie_path','/');
//多主機共享保存 SESSION ID 的 COOKIE,因為我是本地伺服器測試所以設置$domain=''
ini_set('session.cookie_domain',$domain);
//將 session.save_handler 設置為 user,而不是默認的 files
session_mole_name('user');
//定義 SESSION 各項操作所對應的方法名
session_set_save_handler(
array('My_Sess','open'),//對應於類My_Sess的open()方法,下同。
array('My_Sess','close'),
array('My_Sess','read'),
array('My_Sess','write'),
array('My_Sess','destroy'),
array('My_Sess','gc')
);
//session_start()必須位於session_set_save_handler方法之後
session_start();
}
function open($save_path, $session_name) {
//print_r($sesskey);
return true;
} //end function
function close(){
if(self::$db){
self::$db->close();
}
return true;
}
function read($sesskey) {
$sql = 'SELECT `data` FROM `sess` WHERE `sesskey`=' . (self::$db->qstr($sesskey)) . ' AND `expiry`>=' . time();
$rs=self::$db->execute($sql);
if($rs){
if($rs->EOF){
return '';
} else {//讀取到對應於 SESSION ID 的 SESSION 數據
$v = $rs->fields[0];
$rs->close();
return $v;
}
}
return '';
}
function write($sesskey,$data){
$qkey = $sesskey;
$expiry = time()+MY_SESS_TIME;
$arr = array(
'sesskey' => $qkey,
'expiry' => $expiry,
'data' => $data);
self::$db->replace('sess', $arr, 'sesskey', true);
return true;
}
function destroy($sesskey) {
$sql = 'DELETE FROM `sess` WHERE `sesskey`='.self::$db->qstr($sesskey);
$rs =self::$db->execute($sql);
return true;
}
function gc($maxlifetime = null) {
$sql = 'DELETE FROM `sess` WHERE `expiry`<'.time();
self::$db->execute($sql);
//由於經常性的對表 sess 做刪除操作,容易產生碎片,
//所以在垃圾回收中對該表進行優化操作。
$sql = 'OPTIMIZE TABLE `sess`';
self::$db->Execute($sql);
return true;
}
}
//使用 ADOdb 作為資料庫抽象層。
require_once('adodb/adodb.inc.php');
//資料庫配置項,可放入配置文件中(如:config.inc.php)。
$db_type = 'mysql';
$db_host = '127.0.0.1';
$db_user = 'root';
$db_pass = '111';
$db_name = 'sess_db';
//創建資料庫連接。
$cnn=&ADONewConnection($db_type);
$cnn->Connect($db_host,$db_user,$db_pass, $db_name);
//初始化 SESSION 設置,初始化時已經包含了session_start()!
$sess = new My_Sess($cnn);
$sess->init();
$_SESSION['a']='aaa';
$_SESSION['b']='bbb';
$_SESSION['c']='ccc';
print_r($_SESSION);
?>
五、遺留問題 如果網站的訪問量很大的話,SESSION 的讀寫會頻繁地對資料庫進行操作,這樣效率就會明顯降低。考慮到 SESSION 數據一般不會很大,可以嘗試用
C/Java 寫個多線程的程序,用 HASH 表保存 SESSION 數據,並通過 socket 通信進行數據讀寫,這樣 SESSION 就保存在內存中,讀寫速度應該會快很多。另外還可
以通過負載均衡來分擔伺服器負載。

2. php主域名和子域名怎麼樣共享session

session在同一個頂極域下本身就是可共享的。例如www.a.com和news.a.com是可以共享session的,但是不能跨域,例如www.a.com和www.b.com是無法共享session的。

3. 如何在多台web伺服器上共享session

一、將本該保存在web伺服器磁碟上的session數據保存到cookie中

即用cookie會話機制替代session會話機制,將session數據保存到客戶端瀏覽器的cookie中,這樣同一個用戶訪問同一網站時,無論負載均衡到哪台web伺服器,都不用再去伺服器請求session數據,而直接獲取客戶端cookie中的session數據。如此,同一個用戶的登錄狀態就不會丟失了。

但這樣做,有三大弊端:

把session數據放到客戶端的cookie中,一般都是重要數據(如用戶id、昵稱等),會存在安全問題,但可以將session數據加密後,再存放到cookie中,來降低安全風險。

瀏覽器對單個cookie的數據量大小限制為4K左右,因此會存在數據量的限制問題。

影響帶寬性能,降低了頁面的訪問速度。在高訪問量的情況下,用戶每次請求時,都要將客戶端cookie中的session數據發送到伺服器,要佔用較多的帶寬,進而影響訪問速度,伺服器帶寬成本增高。

二、將本該保存在web伺服器磁碟上的session數據保存到MySQL資料庫中

sessionid還是利用cookie機制存儲到客戶端,但session數據卻存放在MySQL伺服器上。(需要建立sessionid和session數據行的對應關系)

但這樣做,只適合訪問量比較小的網站。如果網站的訪問量比較大,對MySQL伺服器會造成很大壓力。因為每次用戶請求頁面(即使是刷新頁面)都要查詢MySQL資料庫中的session數據表,進而判斷用戶的登錄狀態和讀取用戶相關信息,勢必會對資料庫伺服器造成很大壓力,這樣就會降低伺服器的響應速度,影響用戶體驗。

三、將本該保存在web伺服器磁碟上的session數據保存到內存資料庫(memcache或redis)中

memcache或redis是基於內存存儲數據的,性能很高,尤其是高並發的情況下尤為合適。主要是因為從內存中讀取數據要比從磁碟讀取數據快很多。

內存資料庫還支持數據過期失效的機制,正好與session的過期機制對應,推薦使用redis內存資料庫,因為它比memcache支持更多的

數據類型,且支持內存數據備份到磁碟。

這里簡單說一下,後面兩種方法的注意要點:

4. 我們在做登陸的時候,session怎麼共享啊

session多端登錄,就是保持session的一致性。由於session是唯一的,所以要保持session的唯一性,可以將session存放在一個地方,到時候大家取的時候,統一從一個地方取session,這樣就保持了session的一致。
實現session的方法
其實就是將session存放在一個地方,大家存取就好了。至於其他都是附加的,原理就是醬紫。一般實現的方法有:
1)nfs文件共享系統,讓不同項目訪問同一個共享的文件。
2)存放在mysql。
3)存放在內存資料庫,比如redis,memcache等。
4)基於cookie的共享。這個需要域名統一。
3.關於redis的session共享,其他類似
1)php.ini裡面存放得有session的存放地址,可以將session的地址改成redis存放session的地址。session.save_path
但是一般這種伺服器端會有訪問控制。所以可以參考第二種方法
2)重寫session,通過php代碼更改session的存放路徑什麼的。php有相關的session重寫的類。

5. php 如何使用session 讓同一伺服器上的2個域名同時登錄

其實這個真正的學名叫 sso[單點登錄]


我畫個原理圖給你看吧,你應該容易理解



代碼其實沒什麼,也不是關鍵,關鍵是你的思路,人家寫的代碼也很難嵌入到你的系統中去。。


實現的方法很多,看你怎麼想。。。。

6. PHP網頁如何設置二級域名共享session

站點和站點之間是不能共享SESSION的,不管是幾級域名。但是可以通過寫cookie的方法或者單點登錄、WEBSERVICE等技術使站點之間的信息相互交換和共享。

7. thinkphp做的兩套程序的session是共享的,怎麼解決

兩套程序如果在同一域名下,session是同享的,沒法解決

8. php的SESSION是全局所有訪問者共享的還是獨享的

默認每一個用戶有唯一session_id,每個用戶的session信息保存在單獨一個文件下。不同域生成不同的session_id和session文件。

9. php中session作用域的問題,如下圖,框架是library中的內容,現在給ad配一個域名,給admin配一個域名

在php中,伺服器端和客戶端之間的session是通過一個session_id來聯系($_COOKIE['PHPSESSID'],這個PHPSESSID可以通過session_name()修改),並且session數據是以普通文件的形式保存在一個特定的文件夾里。
所以說,只要是同一台伺服器,session數據目錄相同,且兩個域名使用了同一個session_id,那麼兩個域名就會共享session。
如果使用不同session的話,建議在兩個域名進入的時候先使用session_destroy()清除原有的session_id,然後再重新session_start()生成新的session_id,這樣就不會出現兩個站點共享session的情況了。

10. php 一級域名和二級域名怎麼公用session值能傳遞過去,到伺服器不會記錄session,怎

把session 設置在根域名下,
ini_set('session.cookie_domain', 'abc.com');

閱讀全文

與php域名session共享相關的資料

熱點內容
現代鋼琴教程pdf 瀏覽:25
客戶端框架源碼 瀏覽:210
python自動辦公能幹嘛 瀏覽:873
程序員追愛 瀏覽:252
程序員邏輯故事 瀏覽:768
加密icsot23i2c 瀏覽:713
你們有什麼好的解壓軟體 瀏覽:607
常州空氣壓縮機廠家 瀏覽:241
安卓如何關閉app內彈出的更新提示 瀏覽:409
e4a寫的app怎麼裝蘋果手機 瀏覽:201
海立壓縮機海信系 瀏覽:210
社保如何在app上合並 瀏覽:220
小米加密照片後綴 瀏覽:236
我的世界網易手機怎麼創伺服器 瀏覽:978
載入單頁源碼 瀏覽:930
阿里雲伺服器seo 瀏覽:777
海洋斗什麼時候上線安卓 瀏覽:86
中行app如何查每日匯款限額 瀏覽:840
輸入伺服器sn是什麼意思 瀏覽:725
sha1演算法java 瀏覽:90