2010-03-04 45 views
2

編輯:(修訂版)PHP真實的SESSION對象

也許我的問題是不夠清楚。好吧,讓我們這樣說吧:

$arr["a"] = 10; 
var_dump($arr); 
$arr["b"] =& $arr["a"]; 
var_dump($arr); 

第一的var_dump回報:

array 
    'a' => int 10 

,而第二個返回:

array 
    'a' => &int 10 
    'b' => &int 10 

如果我未設置($改編[「一「])它將返回:

array 
    'b' => int 10 

規則是,當2個或更多變量「指向」相同的內容時,var_dump將顯示帶有&字符的引用(&)。

在$ _SESSION的情況下,即使使用register_long_arrays =關閉 $ _SESSION仍顯示參考。所以很明顯,其他變量也指向相同的內容。

換句話說,如果我取消設置($ _ SESSION)還有可以鏈接到其他變量的地方。在上面的例子中,當我創建一個鏈接時,我仍然可以恢復該內容,如:$ arr [「z」] = & $ arr [「b」 ]

所以,我原來的問題是,有誰知道哪個是其他變量?這樣的變量很可能不存在......但我想知道爲什麼PHP內部顯示這個引用。

謝謝


(原題:)

當你在PHP中創建一個會話,例如:

session_start(); 
$_SESSION["name"] = "my name"; 

與轉儲全局變量:

var_dump($GLOBALS); 

你會看到類似這樣的:

'HTTP_SESSION_VARS' => & 
    array 
     'name' => string 'my name' (length=7) 
    '_SESSION' => & 
    array 
     'name' => string 'my name' (length=7) 
    'HTTP_SERVER_VARS' => 
    array 
     ... 

正如你可以看到,這兩個變量$ GLOBAL [HTTP_SESSION_VARS]和$ _SESSION是 引用到其他對象的內容......難道有誰知道這是個啥玩藝?

從理論上講,如果我取消設置這兩個變量,以某種方式必須能夠訪問 內容...任何線索?

謝謝!

+0

我一直在看Zend的PHP源代碼,很有意思的是,在主/ php_variables.c所有超全局初始化,但SESSION,它有它在內線/會話/ session.c自己的文件。到目前爲止,我還沒有線索,如果可能的話。 – lepe 2010-03-04 07:18:09

回答

0

是不是HTTP_SESSION_VARS的向後兼容性?

5

$HTTP_SESSION_VARS$_SESSION舊的,過時,名字 - 你不應該使用了。

那些$HTTP_*_VARS變量並不是必須設置:他們只會如果register_long_arrays配置指令啓用了 - 而且,最近版本的PHP (即PHP 5.3)的,這種模式已經過時。


例如,我的服務器,這是運行PHP 5.3.2,你給的代碼部分:

session_start(); 
$_SESSION["name"] = "my name"; 
var_dump($GLOBALS); 

只輸出(一對夫婦刷新的,這也解釋了存在之後在PHPSESSID餅乾的):

array 
    'GLOBALS' => 
    &array 
    '_POST' => 
    array 
     empty 
    '_GET' => 
    array 
     empty 
    '_COOKIE' => 
    array 
     'PHPSESSID' => string 'fnlujfapqg7kdk1ocve6ndb282' (length=26) 
    '_FILES' => 
    array 
     empty 
    '_SESSION' => & 
    array 
     'name' => string 'my name' (length=7) 

任何$HTTP_*_VARS變量的痕跡:在register_long_arrays配置指令是disab LED。

+0

對不起,我知道...謝謝你指出。 – lepe 2010-03-04 07:13:40

0

那麼,在PHP 5 $HTTP_SESSION_VARS保留僅用於兼容性的原因。強烈建議您改用$_SESSION。從PHP手冊:

$ HTTP_SESSION_VARS包含相同的初始信息,但不是超全局的。 (注>是$ HTTP_SESSION_VARS和$ _SESSION是不同的變量,PHP處理 它們的方式)

編輯
你說你「已經知道」!?那麼你的問題是什麼? $_SESSION不是一個對象,畢竟它是一個ARRAY,一個超全局變量。沒有方法,沒有成員。您可以像訪問其他陣列一樣訪問它的值:$_SESSION['key']

你可以編寫你自己的Session類來包裝PHP的會話管理。使用session_set_save_handler方法可以繞過內置的會話管理並實現自己的邏輯。

問候。

+0

對不起,我知道...謝謝你指出。 – lepe 2010-03-04 07:12:36

0

這是存儲在會話文件中的數據數組,它是存儲在服務器上的實際臨時文件。就像他們指出的那樣,它是一個數組,沒有'Session'對象。當您運行session_start時,會填入這些值,該值基本上會基於該用戶的PHPSESSID Cookie從該文件加載數據。

+0

好的,謝謝。那陣列在哪裏?爲什麼var_dump會顯示一個引用而不是「正常」數組作爲超全球的其餘部分? – lepe 2010-03-04 07:10:32

+0

-1 |無意義。這不是服務器上的「文件」。它在運行時保存在內存中,僅在執行後才寫入「文件」(如果使用基於文件的會話處理,則是)。 – aefxx 2010-03-04 07:57:40

+0

@aefxx:所有服務器都使用基於文件的會話。您可以轉到/ tmp目錄並親自查看所有會話文件。 PHPSESSID只是對路徑/ tmp/sess_PHPSESSID處的唯一標識符存儲會話數據的文件的引用。我可以進入並打開所有會話文件並查看其中的數據,它們都是以文件形式'x | x:x:x;'的形式。數據必須存儲在某個地方,以便通過'session_start'再次獲取... – animuson 2010-03-04 08:03:55