我有兩個基於PHP的應用程序位於同一父目錄下。他們都安裝了登錄機制。我用來存儲的會話變量在兩個應用程序中都有相同的名稱。再說了,爲什麼一個目錄的PHP會話正在影響其他?
$_SESSION["uid"]
現在,當我從應用程序的一個註銷(即基本清除會話變量),它會自動清除其它應用的會話變量。
我該如何防止這種情況發生?
我有兩個基於PHP的應用程序位於同一父目錄下。他們都安裝了登錄機制。我用來存儲的會話變量在兩個應用程序中都有相同的名稱。再說了,爲什麼一個目錄的PHP會話正在影響其他?
$_SESSION["uid"]
現在,當我從應用程序的一個註銷(即基本清除會話變量),它會自動清除其它應用的會話變量。
我該如何防止這種情況發生?
如果您在PHP中使用session_destroy();
,則知道session_destroy();
在調用$_SESSION
時將刪除所有變量。即使您的Web應用程序使用兩個不同的變量名稱,這些變量仍然在$_SESSION
中,在調用session_destroy();
時丟失了這些變量。
我的建議是一個前綴添加到您的$_SESSION
變量,使一個單獨的函數用於清除那些前綴$_SESSION
變量而不是調用session_destroy();
這可以通過增加你的web應用的session_start();
後以下。
對於web應用1:
// Web App 1
define("prefix", "WebApp1");
//SET YOUR SESSION VARIABLES LIKE THIS
$_SESSION[prefix.'authenticated'] = true;
對於web應用2:
// Web App 2
define("prefix", "WebApp2");
//SET YOUR SESSION VARIABLES LIKE THIS
$_SESSION[prefix.'authenticated'] = true;
然後,讓一個單獨的函數用於摧毀我們的前綴,會話變量,而不是session_destroy();
function destroy_session($prefix){
foreach($_SESSION as $key => $value) {
if(preg_match('/^'.$prefix.'/', $value))
unset($_SESSION['key']);
}
}
然後調用此功能在您的網絡應用程序而不是session_destroy();
destroy_session(prefix);
您可以在啓動會話之前設置兩個應用程序的會話參數以及設置會話名稱。這樣當你結束會話時,它只會影響其中的一個。
代碼會是什麼樣子 - 上述功能的 應用1
$sessionName = session_name("appName1");
session_set_cookie_params(0, '/app1', '.domain.com');
session_start();
應用2
$sessionName = session_name("appName2");
session_set_cookie_params(0, '/app2', '.domain.com');
session_start();
更多信息可在以下鏈接找到 - http://php.net/manual/en/function.session-name.php http://php.net/manual/en/function.session-set-cookie-params.php
是兩個在'$ _SESSION'數組中使用相同索引名稱的應用程序? – Ocracoke
您可以嘗試不同的瀏覽器以保持其他應用程序的會話。 –
如何清除會話變量? –