[英]Distinguish between two sessions in PHP
我試着通過以下方式為本地主機上的一個網站編碼。 說localhost / abc:
<?php
session_start();
$_SESSION['name']=$row['name']
?>
產量很好。 但是當同一個代碼用於同一個本地主機上的另一個網頁時,請說localhost / xyz。 然后名字之間存在歧義。 好像我需要區分xyz和abc的會話。
所以我嘗試了這個:
<?php
session_id(226);
session_name(veer);
session_start();
.
.
.//connection with database and all
.
$_SESSION['name']=$row['name'];
echo($_SESSION['name']);
?>
當另一台計算機通過同一服務器登錄時,我創建的會話可由該計算機訪問同一網頁。
有什么解決方案嗎? 或者如何區分兩個會話。
換句話說,當您使用相同的瀏覽器實例訪問同一Web服務器上的兩個不同站點時,您正在訪問服務器的相同內存區域。 從而
http://localhost/xyz
和http://localhost/abc
指的是同一站點localhost,因此你不會通過session_start()
啟動另一個會話,而是恢復它。 你也可以像Jon說的那樣創建虛擬主機,但是為了測試我猜你是哪個,只需使用不同的瀏覽器。
此外,您無法正常在不同的計算機上共享會話,因此我認為這是您的邏輯錯誤。 或者嘗試
session_start();
echo (session_id());
在頁面頂部,看看你是否正在開始或恢復我認為你不是的同一個會話。 我認為你的頁面在不同的會話中存儲相同的數據,你被誤認為是同一個會話。
使用session_regenerate_id();
第二個文件中的方法(xyz)。
這個?
<?php
session_start();
if (!isset($_SESSION['xyz'])) { $_SESSION['xyz'] = array(); }
$_SESSION['xyz']['name'] = $row['name'];
?>
有時而不是做上面的我只是前綴我的會話鍵示例:$ _SESSION ['xyz_name']; 在我意識到我的CPanel已經使用了自己的一些會話導致我的沖突后,我就這樣做了。
來自同一用戶代理到同一Web服務器的請求將共享同一會話,禁止顯式配置,具體取決於您的確切服務器設置。
通常這個問題是可以避免的,因為“其他網頁”實際上完全在另一個域上,因此會話cookie(以及擴展會話數據)將不會被共享。 如果要在localhost
獨立運行單獨的應用程序,也應該執行此操作:在單獨的內部域上設置單獨的虛擬主機。
您也可以通過不直接使用$_SESSION
來存儲數據,而是使用基於某些差異因素(如$_SESSION['SCRIPT_NAME']
的子鍵來完全解決問題。 一個非常簡單的例子:
$sessionKey = "default";
if (strpos($_SESSION['SCRIPT_NAME'], "dir1/")) {
$sessionKey = "dir1";
}
else if (strpos($_SESSION['SCRIPT_NAME'], "dir2/")) {
$sessionKey = "dir2";
}
$_SESSION[$sessionKey]['mydata'] = 'foo';
然而,最后一個是一個非常不優雅的解決方案,我不建議。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.