2010-04-22 146 views
1

我遇到了一個非常有趣的問題,試圖調試我的自定義PHP會話處理程序。出於某種原因,我可以通過會話處理器一直設置cookie,直到寫入函數開始。會話處理程序中的PHP cookie

就我所知,會話處理程序調用按此順序進行。

open -> read -> write -> close 

open函數設置cookie就好了。

function open($save_path,$session_name) 
{ 
    require_once('database.php'); 
    require_once('websiteinfo.php'); 
    mysql_connect($sqllocation,$sql_session_user,$sql_session_pass); 
    @mysql_select_db($sql_default_db); 
    date_default_timezone_set('America/Los_Angeles'); 
    setcookie("test","test"); 
    return TRUE; 
} 

read函數可以設置一個cookie直到它返回一個值。

function read($session_id) 
{ 
    $time = time(); 
    $query = "SELECT * FROM 'sessions' WHERE 'expires' > '$time'"; 
    $query_result = mysql_query($query); 
    $data = ''; 

    /* fetch the array and start sifting through it */ 
    while($session_array = mysql_fetch_array($query_result)) 
    { 
    /* strip the slashes from the session array */ 
    $session_array = $this->strip($session_array); 

    /* authenticate the user and if so return the session data */ 
    if($this->auth_check($session_array,$session_id)) 
    { 
     $data = $session_array['data']; 
    } 
    } 

    setcookie("testcookie1","value1",time()+1000,'/'); 

    return $data; 
} 

寫函數的第一行是設置另一個cookie,它不能因爲頭已經發送。

回答

0

從手冊session_set_save_handler()

注:「寫」處理程序是不直到輸出流 關閉後執行 。因此,在「寫入」處理程序中調試 語句的輸出將不會在瀏覽器中看到。如果 調試輸出是必要的,那麼建議將 調試輸出寫入 而不是文件。

從本質上講,在PHP幾乎完成其執行週期之前,不會發生對會話數據(調用註冊會話寫入函數)的更改。此時,您的所有輸出都已發送,並且無法修改標題信息,因此setcookie()將不起作用。

您可以通過使用session_write_close()提前寫入數據。

+0

我相信這是我的問題的答案先生。非常感謝你。 – steve 2010-04-22 23:27:06