2010-04-22 96 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